c#显式将双精度转换为长期精度损失

c#显式将双精度转换为长期精度损失,c#,double,type-conversion,long-integer,C#,Double,Type Conversion,Long Integer,有谁能帮我理解我哪里出了问题。为什么会发生这种情况: long a = (long)((720000 + 144000) * 0.285); a的实际值:246239 a的预期值:246240 将“a”的类型更改为double并删除转换将得到正确的值,但我正在编写一个程序,它可能会导致非常大的数字-我尝试使用与该类型相同的长值是否不正确 非常感谢您的建议 您看到的是浮点不精确 (720000+144000)*0.285实际计算到246239.999999997 将其作为双精度读取将在打印时取整

有谁能帮我理解我哪里出了问题。为什么会发生这种情况:

long a = (long)((720000 + 144000) * 0.285);
a的实际值:246239

a的预期值:246240

将“a”的类型更改为double并删除转换将得到正确的值,但我正在编写一个程序,它可能会导致非常大的数字-我尝试使用与该类型相同的长值是否不正确


非常感谢您的建议

您看到的是浮点不精确

(720000+144000)*0.285
实际计算到
246239.999999997

将其作为
双精度
读取将在打印时取整,但转换为整型将始终截断


根据您的用例,您可能希望使用
decimal
BigDecimal
实现,而不是double,或仅仅是round。

您会看到浮点不精确

(720000+144000)*0.285
实际计算到
246239.999999997

将其作为
双精度
读取将在打印时取整,但转换为整型将始终截断


根据您的用例,您可能希望使用
decimal
BigDecimal
实现,而不是double,或者仅仅是round。

因为我不允许评论,所以我将在这里给出一个答案,它实际上只是建立在SLacks所说的基础上。如果出于任何原因,您发现需要使用long,那么有一个C#method Math.Round,它将对一个值进行舍入,然后它将为您提供期望的值。当然,四舍五入并不总是最好的选择


因为我不允许发表评论,所以我将在这里给出一个答案,这实际上是建立在SLacks所说的基础上的。如果出于任何原因,您发现需要使用long,那么有一个C#method Math.Round,它将对一个值进行舍入,然后它将为您提供期望的值。当然,四舍五入并不总是最好的选择


必修课:“每个程序员都应该知道的浮点运算”试试
biginger a=newbiginger((720000+144000)*285))/1000
@James谢谢你的那篇文章,我会读一读。必读:“每一个程序员都应该知道浮点”试试
biginger a=newbiginger(((720000+144000)*285))/1000
@James谢谢你的那篇文章,我会仔细阅读的。非常感谢你的及时回复!非常感谢您的及时回复!