除以100精度

PuK*_*PuK 2 c# precision double divide

我正在做一些事情,我遇到了一个我不明白的问题.

double d = 95.24 / (double)100;
Console.Write(d); //Break point here
Run Code Online (Sandbox Code Playgroud)

控制台输出为0.9524(如预期的那样),但如果我在停止程序后查看"d",则返回0.95239999999999991.

我尝试了每一次演员,结果是一样的.问题是我在其他地方使用'd',这个精度问题使我的程序失败了.

那为什么这样做呢?我该如何解决?

Luc*_*tos 8

使用小数而不是double.


Kei*_*thS 6

http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

缺点是浮点数存储在基数为2的科学记数法中.有一个整数有效值被理解为在小数点前面有一个位置,它被提升到2的整数次幂.这允许以相对紧凑的格式存储数字; 缺点是从基数10到基数2和返回的转换可能会引入错误.

为了减轻这种影响,无论何时需要低精度的高精度,都要使用decimal而不是double; 十进制是128位浮点数类型,设计具有非常高的精度,以降低范围为代价(它只能表示高达+ - 79 nonillion,7.9E28,而不是double的数字+ - 1.8E308;仍然足够大多数非天文,非物理计算机程序)和双倍的内存占用.