为什么我的数字四舍五入不正确?这感觉就像是那种只会在现场失败的代码,但我会尝试调整它来代表我所看到的片段。浮动f=myFloat*myConstInt;/*其中myFloat==13.45,而myConstInt==20*/inti=(int)f;inti2=(int)(myFloat*myConstInt);单步执行代码后,i==269,i2==268。如何解释这里的差异?可以比公布的精度更高的精度执行浮点数学运算。但是一旦将它存储在floatf中,就会失去额外的精度。您不会在第二种方法中失去精度,当然,您将结果转换为int。编辑:看到这个问题当由括号分隔与由语句分隔时,为什么C#中的浮点精度不同?为了比我可能提供的更好的解释。因为浮点变量不是无限精确的。如果您需要这种精度,请使用小数。不同的舍入模式也可能解决问题,但准确度问题是你在这里遇到的问题,AFAIK。浮点数的精度有限,并且基于二进制而不是十进制。十进制数13.45不能用二进制浮点数精确表示,所以向下取整。乘以20会进一步放大精度损失。此时你有268.999...-而不是269-所以转换为整数会截断为268。要舍入到最接近的整数,你可以尝试在转换回整数之前加上0.5。对于“完美”算术,您可以尝试Decimal或Rational数字类型——我相信C#有这两种类型的库,但我不确定。但是,这些会更慢。编辑-到目前为止,我已经找到了一个“十进制”类型,但不是有理数-我可能是错的。十进制浮点数是不精确的,就像二进制一样,但这是我们习惯的那种不精确,所以它给出的结果并不令人惊讶。使用。..而不是doublef=myFloat*myConstInt;看看你是否得到相同的答案。我想提供一个不同的解释。这是代码,我已将其注释掉(我正在查看内存以剖析浮点数):floatmyFloat=13.45;//在二进制中是1101.01110011001100110011intmyConstInt=20;浮动f=myFloat*myConstInt;//二进制恰好是100001101(十进制269)inti=(int)f;//将float269转换为int269-没有意外inti2=(int)(myFloat*myConstInt);//“额外精度”导致四舍五入到268让我们小心看一下计算:更新:我提炼了我的答案并写了一篇名为“浮点数不像浮点数”的完整文章以上是C#学习教程:为什么我的数字是否四舍五入不正确?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
