gpt4 book ai didi

php - 如何解释这个php浮点和整数比较和打印问题?

转载 作者:行者123 更新时间:2023-12-05 06:49:47 25 4
gpt4 key购买 nike

for($i=0;$i<10000;$i++) {
$random=random_int(100,1000);
$div = random_int(1,100);
$rant_zoom = $random/$div;
$rant_zoom = $rant_zoom*$div;
if ($random != $rant_zoom) {
var_dump($random,$rant_zoom);
echo "-----------\r\n";
}
}

example for output

有可能 float 不准确,不等于原来的值,但是var_dump打印的结果却显示相同的值,这是为什么?

最佳答案

我无法用这些位来解释底层的“魔法”,但我很确定这与固定和 float 的表示和转换方式有关。

代码中需要注意的几点:

  • 变量 $div$randomint 并且保持 int
  • 在你的 if 中,你正在用 != 比较一个 int 和一个 float 所以值被转换在比较它们之前

在研究答案时,我也遇到了 this SO post ,这表明 var_dump 正在 secret 地舍入数字

这是我的代码版本,我想尝试多种方法:

for($i=0; $i<100; $i++) {
$original = mt_rand(100, 1000);
$div = mt_rand(1,100);

$internal_part = $original / $div;
$internal = $internal_part * $div;

$bcmath_part = bcdiv($original, $div, 50);
$bcmath = bcmul($bcmath_part, $div, 50);

$diff_1 = $original - $internal;
$diff_2 = bcsub($original, $bcmath, 50);

var_dump($original, $internal, $div);

echo "<p>Full scale results:</p>";

echo sprintf("Internal: %s <br>", rtrim(number_format($internal, 100),0));
echo sprintf("Bcmath: %s <br>", rtrim(number_format($bcmath, 100),0));

echo "<p>both as Float</p>";

echo sprintf("Division: <code>%f</code> ", $internal_part);

echo sprintf("Internal: <code>%f</code> != <code>%f</code> Diff1: %f<br>", (float)$original, $internal, $diff_1);

echo sprintf("Division: <code>%f</code> ", $bcmath_part);
echo sprintf("Bcmath: <code>%f</code> != <code>%f</code> Diff2: %f <br>", (float)$original, $bcmath, $diff_2);

echo "<p>both as INT</p>";

echo sprintf("Internal: <code>%d</code> != <code>%d</code><br>", $original, (int)$internal);
echo sprintf("Bcmath: <code>%d</code> != <code>%d</code>", $original, (int)$bcmath);

echo "<hr>";
}

在“全刻度”打印中,您应该看到内部除法(默认)结果只是非常非常接近一个整数,但它们不是:

只是740/43 * 43的一个例子:

Simple division and multiplication : 739.9999999999998863131622783839702606201171875
using Bcmath: 740

我认为 var_dump 只是在一些 9 之后放弃并称其为整数,而实际值仍然是一个 float 。

结论:使用bcmath或在这些情况下精确的东西 - 特别是在金融方面

关于php - 如何解释这个php浮点和整数比较和打印问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66514740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com