This question already has answers here:
Why python decimal.Decimal precision differs with equable args?
                                
                                    (2个答案)
                                
                        
                                2年前关闭。
            
                    
我知道这个问题已经被问了无数次了,我遇到了很多博客和答案,但这使我不寒而栗。我只想将两个十进制数乘以100,以便摆脱其十进制数:

>>> 4321.90 * 100
432189.99999999994
>>> Decimal(4321.90) * Decimal(100)
Decimal('432189.9999999999636202119291')


我不敢对这种看似微不足道的操作使用四舍五入。会安全吗?如果精度问题对我不利,结果接近xxx.5怎么办?会发生吗?我确实了解二进制级别的问题,但是我来自C#,而.Net的decimal类型没有这个问题:

decimal x = 4321.90m;
decimal y = 100m;
Console.WriteLine(x * y);
432190,00


我以为Python的十进制模块应该可以解决这个问题。我准备将初始值转换为字符串,并通过字符串操作进行数学运算,对此我感到很不好。

最佳答案

它在Python中失败的主要原因是因为4321.90被解释为浮点数(此时您失去了精度),然后在运行时转换为Decimal。使用C#,4321.90m解释为十进制开头。 Python根本不支持将小数作为内置结构。

但是有一种简单的方法可以使用Python修复它。只需使用字符串:

>>> Decimal('4321.90') * Decimal('100')
Decimal('432190.00')

关于python - Python十进制与C#十进制精度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44812420/

10-17 00:21
查看更多