PHP数学差异

PHP数学差异,php,math,decimal,rounding,Php,Math,Decimal,Rounding,这里有一些简单的数学,这不太合算 990/7670=0.12907431 假设我想收取1%的费用,我从1000开始 同样的计算也适用于上述(1000-1%=990) 首先: 990/7670=0.12907431 然后使用我原来的数字(+1%): 1000/0.12907431=7747.4750785 最后,以抵消从1000减少的1%。我将7670增加1%: 7670*1.01=7746.7 为什么最后两个值之间有0.01%的差异?这个PHP处理小数的能力差吗 我看不出我在哪里失去了这些,我觉

这里有一些简单的数学,这不太合算

990/7670=0.12907431

假设我想收取1%的费用,我从1000开始

同样的计算也适用于上述
(1000-1%=990)

首先:
990/7670=0.12907431

然后使用我原来的数字(+1%):
1000/0.12907431=7747.4750785

最后,以抵消从1000减少的1%。我将7670增加1%:
7670*1.01=7746.7

为什么最后两个值之间有0.01%的差异?这个PHP处理小数的能力差吗


我看不出我在哪里失去了这些,我觉得数学是正确的。我知道PHP有时会出现舍入问题,我想知道它是否如此简单,或者我是否错过了一个obv数学错误。

990+1%不等于1000。它等于999.9

990*1.01=999.9


也就是说,您永远不能依靠像这样的不同浮点计算来计算精确的答案。与其他语言一样,PHP没有“舍入问题”,而是使用与实数不完全相同的浮点数。

关于浮点数的进一步说明-由于计算机本身以2为基数,因此必须近似以10为基数的小数。正如你不能精确地把1/3写进十进制一样,10进制的小数也不能总是精确地存储在2进制中。因此,需要四舍五入。如果你需要浮点数字的精度,考虑使用扩展。当然,你不能像这样逆转它。所以你的意思是,在这个场景中,7670相当于990。将1%添加到7670=7746.7(999.9)。但7747.4750785-1%相当于7670。这就是我所缺少的区别。如果我把百分比从1%增加到10%。差距变得更大。我想这解决了我的问题。我只需要知道如何编码,而不知道原始数字(1000或990)
(990/(100-1%)*100=1000
。这是我的解决方案。
(7670/(100-1))*100=7747.47