截断经过Math.Round处理后的double类型值是否安全?
Math.Round转int的隐藏陷阱
搞过.NET开发的朋友大概率踩过这个坑:Math.Round(myDouble)返回的是double类型,但因为double的精度天生有限,它给出的结果未必是严格的整数值——有时候会略大于目标整数,有时候又会略小于。
咱们分两种情况拆解:
- 当返回值略大于目标整数时,强制转
int是安全的:比如Math.Round(19.5)可能会返回20.0000000000002,这时候用(int)强制转换,会直接截断小数部分,得到20,和预期完全一致。 - 但如果返回值略小于目标整数,强制转
int就危险了:举个例子,假设某个数值经过四舍五入后应该是10,但实际返回的是9.999999999999998,这时候(int)转换会直接把它变成9,完全偏离了正确结果。
所以千万别想当然地认为Math.Round的结果转int就万无一失,得留意这个精度带来的隐形坑!
内容的提问来源于stack exchange,提问作者Phil
相关产品推荐
相关产品推荐

