【问题标题】:Incorrect result when using intval/floatval on a particular number对特定数字使用 intval/floatval 时结果不正确
【发布时间】:2017-09-18 06:54:40
【问题描述】:

我在将这个特定数字10.12 转换为整数时遇到问题。下面是我尝试过的代码 sn-p 以及结果如何。请告知这是否是一个错误,如果我可以帮助报告它。

<?php

echo "This is the problem, im expecting 1012". PHP_EOL;
echo intval((floatval("10.12") * 100)) . PHP_EOL; //1011

echo "Just Floatval". PHP_EOL;
echo (floatval("10.12") * 100) . PHP_EOL; //1012

echo "Convert to string (other number)". PHP_EOL;
echo intval((floatval("11.12") * 100)) . PHP_EOL; //1112

echo "Convert to string (other number)". PHP_EOL;
echo intval((floatval("10.13") * 100)) . PHP_EOL; //1013

echo "Use bcmul instead". PHP_EOL;
echo bcmul("10.12", 100) . PHP_EOL; //1012

我还创建了一个 sn-p 在 https://3v4l.org/cnIfL

【问题讨论】:

标签: php hhvm


【解决方案1】:

我的经验是 intval() 返回值的内部表示的下限,而不是隐含的值。例如,如果 val 的内部表示对应于 10.11999999,则 intval($val*100) 将返回 1011 而不是预期的 1012。

其他函数,例如 sprintf("d",val*100) 确实返回预期值。

【讨论】:

    【解决方案2】:

    使用 round 函数(在 PHP 8.0.10 上测试):

    <?php
    var_dump(intval(floatval(100 * "10.12"))); // int(1011)
    var_dump(intval(round(floatval(100 * "10.12")))); // int(1012)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 2020-03-26
      相关资源
      最近更新 更多