c#明确地将双倍转换为长期丢失的准确性

时间:2013-12-12 17:55:59

标签: c# double type-conversion long-integer

任何人都可以帮我理解我在哪里出错了。为什么会发生这种情况:

long a = (long)((720000 + 144000) * 0.285);

a的实际值:246,239

预期价值a:246,240

将'a'的类型更改为double并删除转换会产生正确的值,但我正在编写一个可能导致非常大的数字的程序 - 我是否因为尝试使用long类型而不正确?

非常感谢任何建议!

2 个答案:

答案 0 :(得分:4)

你看到浮点不精确。

(720000 + 144000) * 0.285实际上计算为246239.99999999997 读取它作为double将在打印时向上舍入,但是转换为整数类型将始终截断。

根据您的使用情况,您可能希望使用decimalBigDecimal实施,而不是使用双倍,或者只是使用。

答案 1 :(得分:0)

因为我不允许发表评论我会在这里提出答案,这实际上只是建立在SLacks所说的基础之上。如果由于某种原因你发现你需要使用long,那么有一个C#方法Math.Round将对一个值进行舍入,然后给出预期的值。当然,舍入并不总是最好的选择。

http://msdn.microsoft.com/en-us/library/75ks3aby%28v=vs.110%29.aspx