微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP.减去两个浮点数的结果

例如…

$aa = 10694994.89;
$bb = 10696193.86;
$ab = $aa - $bb;
// result is:-1198.9699999988 not the -1198,97

在这个例子中:

$cc = 0.89;
$dd = 0.86;
$cd = $cc - $dd;
//Result is: 0.03

为什么区别于例子?缺乏精确度?

解决方法:

您的代码中的数字都不能用二进制浮点表示.它们都以某种方式被舍入.问题是为什么其中一个结果(看似)四舍五入到两位小数而不是另一个.答案在于浮点数的精度和准确度与PHP用于打印它们的精度之间的差异.

浮点数由[1,2]范围内的有效数(或尾数)表示,通过将其乘以2的幂来进行缩放. (这就是浮点“漂浮”的意思).数字的精度由有效数字中的位数确定.精度取决于这些数字中有多少实际上是正确的.有关详细信息,请参阅:How are floating point numbers are stored in memory?.

当您在PHP中回显浮点数时,它们首先使用precision配置设置转换为字符串,认为14.(在Zend/zend_operators.c中)

要查看实际情况,您必须使用更大的精度打印数字:

$aa = 10694994.89;
$bb = 10696193.86;
$ab = $aa - $bb;

printf ("\$aa: %.20G\n", $aa);
printf ("\$bb: %.20G\n", $bb);
printf ("\$ab: %.20G\n\n", $ab);

$cc = 0.89;
$dd = 0.86;
$cd = $cc - $dd;

printf ("\$cc: %.20G\n", $cc);
printf ("\$dd: %.20G\n", $dd);
printf ("\$cd: %.20G\n", $cd);

输出

$aa: 10694994.890000000596
$bb: 10696193.859999999404
$ab: -1198.9699999988079071

$cc: 0.89000000000000001332
$dd: 0.85999999999999998668
$cd: 0.030000000000000026645

初始数字的精度约为16到17位.当你减去$aa- $bb时,前4位数相互抵消.结果(虽然仍然具有大约16到17位的精度),现在仅精确到大约12位.当使用14位精度打印结果时,会显示较低的精度.

一个减法($cc- $dd)仅丢失一位精度,这在以14位精度打印时无法显示.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐