为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
梦里花落0921 2022-01-14 16:50:55
如果我使用 (int) 在浮点类型变量和整数之间转换乘积,则结果不是我所期望的。请看我的代码。期望结果是 4090270,而不是 4090269(int)(4090270.0) 工作正常$amount = 40902.70; // Same for  40902.20$amount= (int)($amount*100);echo $amount; /// Output :  4090269
查看完整描述

2 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

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

根据 PHP 文档

浮点数的精度有限。尽管取决于系统,但 PHP 通常使用 IEEE 754 双精度格式,由于在 1.11e-16 的数量级四舍五入,这将给出最大的相对误差。非初等算术运算可能会产生较大的误差,当然,当多个运算复合时,必须考虑误差传播。

此外,可以精确表示为以 10 为底的浮点数的有理数,如 0.1 或 0.7,没有精确表示为以 2 为底的浮点数,无论尾数大小如何,它都在内部使用。因此,它们不能被转换成它们内部的二进制对应物,而不会有小的精度损失。这可能会导致令人困惑的结果:例如, floor((0.1+0.7)*10) 通常会返回 7 而不是预期的 8,因为内部表示将类似于 7.9999999999999991118...。

请参阅此参考


查看完整回答
反对 回复 2022-01-14
?
慕码人2483693

TA贡献1860条经验 获得超9个赞

像这样试试。


$amount = 40902.70; // Same for  40902.20

$amounts= intval(strval($amount*100));;

echo $amounts;

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


欲了解更多信息检查:参考


$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 传递。


查看完整回答
反对 回复 2022-01-14
  • 2 回答
  • 0 关注
  • 142 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信