2013-04-22 68 views
0

我有一个浮点数,说1.2999,当放入Convert.ToDecimal回报1.3。我想将数字转换为小数的原因是加法和减法时的精度,而不是四舍五入。我确信小数类型可以保存这个数字,因为它可以保存比float数字更大的数字。转换为十进制没有四舍五入

为什么四舍五入的数量吗?无论如何阻止它四舍五入?

编辑:我不知道为什么我的是四舍五入而你的是不是,这是我的确切代码:

decNum += Convert.ToDecimal((9 * 0.03F) + 0); 

我真搞不清楚了。当我进入调试器并看到​​部分的输出时,它将0.269999981显示为浮点数,但随后将其转换为十进制0.27。但我知道9的3%是0.27。那么这是否意味着原来的计算是不正确的,而转换只是修复它?

哎呀我讨厌数字这么多笑!

+0

它应该有效。 – 2013-04-22 12:27:31

+0

@HseseinNarimaniRad同意。它不会在我的机器上四舍五入。 – 2013-04-22 12:27:52

+3

无法重现。 'Console.WriteLine(Convert.ToDecimal(1.2999));'打印'1.2999'。 – Heinzi 2013-04-22 12:28:28

回答

7

你说的是发生似乎并没有发生什么事。

这个程序:

using System; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      float f = 1.2999f; 
      Console.WriteLine(f); 
      Decimal d = Convert.ToDecimal(f); 
      Console.WriteLine(d); 
     } 
    } 
} 

打印:

1.2999 
1.2999 

我认为当你的价值转换为字符串,你可能会遇到的问题。

此外,作为ByteBlast低于所指出的,或许你给我们的错误的测试数据。

使用float f = 1.2999999999f;确实打印1.3

其原因是浮点值不够精确代表1.299999999f准确。该特定值最终被四舍五入为1.3 - 但请注意,这是一个正在四舍五入之前转换为十进制浮点价值

如果使用double代替float,这种情况不会发生,除非你去甚至更精确的数字(当你到达1.299999999999999

根据修改后的问题[编辑] ,我想它只是预期的舍入误差,所以肯定阅读以下内容:

详见"What Every Computer Scientist Should Know About Floating-Point Arithmetic"

Also see this link(由Tim Schmelter在下面的评论推荐)。

另一件需要注意的事情是,调试器可能会显示不同的精度级别的数字,其默认级别为double.ToString()(或等效),因此可能会导致您看到稍微不同的数字。


旁白:

你可能有一些运气的 “往返” 格式说明:

Console.WriteLine(1.299999999999999.ToString()); 
Prints 1.3 

但是:

Console.WriteLine(1.299999999999999.ToString("r")); 
Prints 1.2999999999999989 

(需要注意的是偷偷摸摸的小8日倒数第二位!)

为了获得最终精度,您可以使用the Decimal type,因为您已经在做这些。这为基数为10的数字进行了优化,并提供了更多的精度数字。

但是,请注意,它比floatdouble慢几百倍,并且它也可能遭受舍入误差,尽管少得多。

+0

我想他只是搞砸了他的测试数据。试试'1.2999999999f;' – 2013-04-22 12:30:04

+0

@ByteBlast:使用'1.2999999999f',你甚至不需要'ToDecimal':'Console.WriteLine(1.2999999999f);'打印'1.3'。对于这个数字,我不认为'浮动'具有足够的精度。 – Heinzi 2013-04-22 12:30:56

+0

同样在这里,我得到了确切的输出 – Stasel 2013-04-22 12:31:07