(int)不能正确对乘法结果进行类型转换

时间:2019-09-18 06:25:33

标签: php type-conversion integer

如果我使用(int)在浮点类型变量和整数之间转换乘积,结果将不是我期望的结果。请查看我的代码。

期望结果是4090270,而不是4090269

(int)(4090270.0)正常工作

$amount = 40902.70; // Same for  40902.20
$amount= (int)($amount*100);
echo $amount; /// Output :  4090269

2 个答案:

答案 0 :(得分:0)

尝试这样。

$amount = 40902.70; // Same for  40902.20
$amounts= intval(strval($amount*100));;
echo $amounts;

注意: intval和int通过截断数字的小数部分将双精度转换为整数。

有关更多信息,请检查:reference

$test1 = intVal(1999);

$amount = 19.99 * 100;
$test2 = intVal($amount);
$test3 = intVal("$amount");

echo $test1 . "<br />\n";
echo $test2 . "<br />\n";
echo $test3 . "<br />\n";

expected output:
1999
1999
1999

actual output
1999
1998
1999

似乎是一个浮点问题,但是我能够获得的唯一数字是1999。 19.99是很多东西的价格,出于我们的目的,我们必须将其传递为1999,而不是19.99。

答案 1 :(得分:0)

请不要将未知分数转换为整数,因为这有时会导致意外结果。

根据PHP文档

  

浮点数的精度有限。尽管它取决于系统,但PHP通常使用IEEE 754双精度格式,由于舍入为1.11e-16的顺序,它将提供最大的相对误差。非基本算术运算可能会产生更大的错误,并且,当多个运算复合时,当然必须考虑错误传播。

     

此外,在底数10中可精确表示为浮点数的有理数(如0.1或0.7)在底数2中不具有作为浮点数的精确表示,内部使用,无论尾数的大小如何。因此,如果不损失一点点精度,就不能将它们转换为内部二进制副本。这可能导致混乱的结果:例如,floor((0.1 + 0.7)* 10)通常返回7而不是预期的8,因为内部表示形式类似于7.9999999999999991118。...

请参阅此reference

相关问题