代码之家  ›  专栏  ›  技术社区  ›  Musterknabe

从浮点转换为int时的舍入错误

  •  1
  • Musterknabe  · 技术社区  · 6 年前

    我们有一个API,它以字符串形式以欧元返回价格,例如:。 2.55 0.035 。然而,我们的数据库以美分的形式保存它,所以我编写了一个非常简单的方法,只需执行以下操作即可将其转换为美分

    $cents = (int) ((float) $value['value']['amount'] * 100)

    所以对于这个代码

    echo (int) ((float) '2.55' * 100);

    结果应该是 255 正当但不知怎么的 254 。只需执行以下操作,即可在CLI上测试这一点

    php -r "echo (int) ((float) '2.55' * 100);"

    当我得到 (float) '2.55' * 100) 这很简单 255 ,当我将其转换为int时 255 ,为什么在同一个调用中将其转换为int不一样?

    我是说,我可以 '2.55' * 100 php casting可以正确计算,但我仍然很好奇为什么会发生这种情况?

    版本:

    PHP 7.1.15-1+ubuntu16.04.1+deb。苏里。org+2(cli)(构建时间:2018年3月6日11:10:13)(NTS)

    1 回复  |  直到 6 年前
        1
  •  2
  •   Eddie    6 年前

    可能是浮点错误。

    在php中,像255这样的浮点值实际上可能是254.999991。你可以 round 转换为之前的值 int

    echo (int) ( round( (float) '2.55' * 100 ) );
    

    这将导致

    255
    

    来自PHP文档:

    警告浮点精度浮点数字有限 精确虽然这取决于系统,但PHP通常使用 IEEE 754双精度格式,将提供最大相对 由于按1.11e-16的顺序舍入而导致的错误。非初等 算术运算可能会产生较大的错误,当然还有错误 当多个操作复合时,必须考虑传播。

    http://php.net/manual/en/language.types.float.php