C#中double乘法结果转short出现错误的原因咨询
问题原因与解决方案
这是典型的浮点数精度误差加上整数类型转换规则导致的问题,具体拆解如下:
- 浮点数的存储特性:你看到的"29.0"只是显示上的近似值,实际代码中乘法运算后得到的浮点数(比如double类型)可能是一个略小于29的数值,比如
28.999999999999996。这是因为二进制浮点数无法精确表示所有十进制小数,运算过程中会积累微小的精度偏差。 - 强制类型转换的规则:当把浮点数转换为short这类整数类型时,语言会直接截断小数部分(而非四舍五入)。哪怕数值只比29小一点点,截断后都会得到28。
验证方式
你可以把这个浮点数打印到足够多的小数位来确认实际值,比如用类似这样的代码:
double result = 你的乘法运算表达式; System.out.printf("%.20f", result);
运行后就能看到它并非精确的29.0。
解决办法
如果需要得到正确的整数结果,先对浮点数进行四舍五入,再转换为short:
short correctResult = (short) Math.round(result);
这样就能得到预期的29。
内容的提问来源于stack exchange,提问作者pengg
相关产品推荐
相关产品推荐

