例如...
$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
为什么与示例有所不同?精度不够?
代码中的任何数字都不能以二进制浮点表示。[[精确地]]。它们都以某种方式被四舍五入。问题是为什么其中一个结果(看似)四舍五入到两位小数而不是另一位。答案在于浮点数的precision和accuracy与PHP用于打印它们的精度之间的区别。浮点数]由范围 significand[1, 2)
中的echo
浮点数时,首先使用precision
配置设置将它们转换为字符串,默认设置为14。(在precision
中)
要查看实际情况,必须以更高的精度打印数字:
输出:
Zend/zend_operators.c
初始数字的精度约为16到17位数字。当您减去到约12位数字。当使用14位精度打印结果时,会显示出较低的精度。[另一个减法($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位数字的精度),现在仅准确
$aa: 10694994.890000000596
$bb: 10696193.859999999404
$ab: -1198.9699999988079071
$cc: 0.89000000000000001332
$dd: 0.85999999999999998668
$cd: 0.030000000000000026645
)仅失去一位数字的精度,当以14位精度打印时不明显。