任何人都可以帮我理解我在哪里出错了。为什么会发生这种情况:
long a = (long)((720000 + 144000) * 0.285);
a的实际值:246,239
预期价值a:246,240
将'a'的类型更改为double并删除转换会产生正确的值,但我正在编写一个可能导致非常大的数字的程序 - 我是否因为尝试使用long类型而不正确?
非常感谢任何建议!
答案 0 :(得分:4)
你看到浮点不精确。
(720000 + 144000) * 0.285
实际上计算为246239.99999999997
读取它作为double
将在打印时向上舍入,但是转换为整数类型将始终截断。
根据您的使用情况,您可能希望使用decimal
或BigDecimal
实施,而不是使用双倍,或者只是使用。
答案 1 :(得分:0)
因为我不允许发表评论我会在这里提出答案,这实际上只是建立在SLacks所说的基础之上。如果由于某种原因你发现你需要使用long,那么有一个C#方法Math.Round将对一个值进行舍入,然后给出预期的值。当然,舍入并不总是最好的选择。
http://msdn.microsoft.com/en-us/library/75ks3aby%28v=vs.110%29.aspx