gpt4 book ai didi

php - 为什么这些值没有被正确求和?

转载 作者:行者123 更新时间:2023-11-29 12:19:08 26 4
gpt4 key购买 nike

我对此有点困惑,不明白这里发生了什么,我是否在这里遗漏了一些东西,有人可以解释一下,我想理解,但找不到任何在线资源来解释它或为什么会发生。

为什么下面的等式在 PHP 中等于 0.23999999999999 而不是 0.24。我在这里不进行四舍五入,所有值都精确到小数点后两位。那么为什么答案会被这些 0.009999999999 填充呢?

return 65.00 + 0.03 - 0.90 - 50.00 - 13.89;
float(0.23999999999999)

我该如何解决这个问题,或者让它准确显示从数据库检索的内容,而不是填充这些 9。

数据库中的所有值都存储为十进制 10,2

最佳答案

floating point numbers 在计算机中根据 IEEE 574 standard 表示。

简单来说,小数在计算机中使用固定数量的位数(数字)进行编码,就像我们在纸上写下实数一样(我们使用 base 10 来写数字,计算机使用 base 2 来处理他们)。但并非所有小数都可以使用有限位数来书写(无论我们使用什么基数来书写它们)。事实上,他们中的大多数人都有无限的代表权,只有一小部分人享有特权。

例如,1/3是一个小数,无法使用十进制精确表示。你可以把它写成 0.30.330.333 甚至 0.3333333333333333 ,但没有人能写出它的所有数字。无论您写入多少个 3 ,都会有一个点停止,并且您写入的数字不是 1/3 的精确值,而是一个近似值(足够接近真实值的值) )。

使用近似值时总会出现错误。它们很小,可以忽略不计,但算术运算会使它们累积起来,有时它们会变得足够大,足以影响最终结果的正确性。

我们从小学就知道 3 * 1/3 = 1 。将上面显示的 1/3 的表示乘以 3 将产生 0.90.990.9990.9999999999999999 。所有这些数字都接近 1 但没有一个等于 1

哎呀,我们刚刚遇到了舍入错误!

在现实生活中,我们习惯于对所使用的数字进行舍入,而忽略舍入误差。计算机以不同的方式工作。他们尽力获得最好的结果,如果没有被告知这样做,他们就不会四舍五入数字。

一些可以使用基数 10 的有限位数精确表示的数字,在基数 2 中却可以无限表示。例如,1/10 在基数 10 中是 0.1,但不能使用基数 2 中的有限位数表示。基数2。

事实上,只有分母为 power of 2 的分数在基数 2 中具有有限表示。在基数 10 中,可以用有限位数表示的数字是分母类似于 2<sup>m</sup>*5<sup>n</sup> 的分数,其中 mnnon-negative integers

为什么是我?

PHP uses the standard IEEE 574 floating point 格式(与许多其他编程语言一样),这就是代码中的数字在内部不准确表示的原因。

您可以使用函数 number_format() sprintf() 生成具有所需位数的数字表示形式。如果您需要的位数小于浮点表示的精度,number_format() 将产生您期望的精确值

如果您正在处理金钱,您应该始终使用 number_format($number, 2) 来获取您正在处理的金额的最终表示。

另一方面,

MySQL 实现 float (单精度和 double )和 fixed-point types DECIMAL 列类型保证存储中数字的准确表示(使用列定义中指定的小数位数)以及使用它们进行计算的准确结果。

然而,这种精度会降低处理速度,但总的来说,优点克服了缺点。

当然,当将值加载到 DECIMAL 进行处理或显示时,PHP 数据类型的精度和准确度会立即被破坏。

关于php - 为什么这些值没有被正确求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29300038/

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