PHP。两个浮点数相减的结果

问题描述 投票:5回答:2

例如...

$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 floating-point-precision subtraction
2个回答
5
投票

代码中的任何数字都不能以二进制浮点表示。[[精确地]]。它们都以某种方式被四舍五入。问题是为什么其中一个结果(看似)四舍五入到两位小数而不是另一位。答案在于浮点数的precisionaccuracy与PHP用于打印它们的精度之间的区别。浮点数]由范围[1, 2)中的

significand

(或mantissa)表示,通过将其乘以2的幂进行缩放。 (这就是浮点数中的“ floating”的含义)。数字的precisionsignificand中的位数确定。 accuracy由实际上正确的数字位数确定。请参阅:How are floating point numbers stored in memory?了解更多详细信息。[当您在PHP中使用echo浮点数时,首先使用precision配置设置将它们转换为字符串,默认设置为14。(在precision中)

要查看实际情况,必须以更高的精度打印数字:

Zend/zend_operators.c

输出:

Zend/zend_operators.c
初始数字的精度约为16到17位数字。当您减去$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);
时,前4位数字相互抵消。结果(尽管仍具有约16到17位数字的精度),现在仅

准确

到约12位数字。当使用14位精度打印结果时,会显示出较低的精度。[另一个减法($aa: 10694994.890000000596 $bb: 10696193.859999999404 $ab: -1198.9699999988079071 $cc: 0.89000000000000001332 $dd: 0.85999999999999998668 $cd: 0.030000000000000026645 )仅失去一位数字的精度,当以14位精度打印时不明显。

1
投票
这应该为您工作:
© www.soinside.com 2019 - 2024. All rights reserved.