1.23 这个数值,在 float 在内部二进制转换时已经失真,为什么乘以 100 之后,最终的高精度表示结果 不是 1.2299999**** 类似这样的,而是 1.23000000000 这个结果呢?
PHP 的乘法运算符进行了猜测修正吗?
为什么乘以 100,最终结果是保真的, 乘以 10,不是保真的呢?
乘法运算符的代码: https://github.com/php/php-src/blob/master/Zend/zend_multiply.h
求大神解读。
[运行结果在 PHP5.4、5.6 和 7.1 上无差异,另外, 乘以 10 的结果是不保真的]
运行代码为:
<?php
echo "<meta charset='utf-8'>";
$a = 1.23;
$b = 100; //第二次运行 $b = 10;
echo '
<pre>
$a = 1.23;
$b = 100;
</pre><hr>
';
echo '$a 的高精度数值为:';
printf("%0.30f", $a);
echo '<hr>';
echo '$b 的高精度数值为:';
printf("%0.30f", $b);
echo "<br><br><hr>";
echo '$a 的数据类型: ';
var_dump($a);echo "<hr>";
echo '$b 的数据类型: ';
var_dump($b);echo "<hr>";
$total = $a * $b;
echo '执行的计算为:
<pre>
$total = $a * $b;
</pre>
';
echo "<br><br><hr>";
echo '计算结果:$total 为 ';
var_dump($total);echo "<hr>";
echo '高精度计算结果: ';
printf("%0.99f", $total);
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.