转换为double是不准确的数字

时间:2012-01-27 15:43:37

标签: c#

Convert.ToDouble正在添加零和1,如下图所示:

enter image description here

为什么它从21.62变为21.620000000000001? 这是关于浮点问题吗?

4 个答案:

答案 0 :(得分:4)

Double(和Float)是floating-point类型,在二进制系统中会有一些不精确。

如果您需要更精确的比较,请使用decimal。如果您只是在进行计算double应该没问题。如果您需要比较双精度绝对等值,那么将差值的绝对值与一些小常数进行比较:

if (a == b)  // not reliable for floating point
{ 
    ....
}

double EPSILON = 0.0000001;
if (Math.Abs(a-b) < EPSILON)
{
    ....
}

答案 1 :(得分:3)

浮点数有一些近似问题。 这是因为小数分数如0,00001无法在二元系统上精确表示(其中小数在模块q / p中表示)。 问题是内在的。

答案 2 :(得分:2)

简而言之,是的;在任何两个基数之间(在这种情况下,2和10),总有一些值可以表示w /有限数量的“十进制”(二进制?)位置,而不能存在于另一个中。

答案 3 :(得分:0)

像这样的舍入错误在几乎所有高级编程语言中都很常见。在Java中,为了解决这个问题,如果需要保证准确性,可以使用名为BigDecimal的类。否则,您可以编写一个将小数舍入到您需要的最近位置的方法。