This question already has answers here:
Why python decimal.Decimal precision differs with equable args?
(2个答案)
2年前关闭。
我知道这个问题已经被问了无数次了,我遇到了很多博客和答案,但这使我不寒而栗。我只想将两个十进制数乘以100,以便摆脱其十进制数:
我不敢对这种看似微不足道的操作使用四舍五入。会安全吗?如果精度问题对我不利,结果接近xxx.5怎么办?会发生吗?我确实了解二进制级别的问题,但是我来自C#,而.Net的
我以为Python的十进制模块应该可以解决这个问题。我准备将初始值转换为字符串,并通过字符串操作进行数学运算,对此我感到很不好。
(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/