从双精度到字节的转换会产生意外的结果
本文关键字:意外 结果 转换 双精度 到字节 | 更新日期: 2023-09-27 17:57:27
让我们考虑一个场景:我们在程序中有一个双变量,表示字节值的百分比。经过一些操作,我们用简单的范围转换out = 2.55*original
将上述双精度转换为字节。但是在100%的情况下会发生什么呢?
double a = 100.0;
Console.WriteLine("original: {0}", a);
Console.WriteLine("original*2.55: {0}", (2.55*a));
byte b = (byte)(2.55*a);
Console.WriteLine("byte: {0}", b);
Console.WriteLine("wat -.-: {0}", (byte)(100.1 * 2.55));
>original: 100
>original*2.55: 255
>byte: 254 <------------------!!!
>wat -.-: 255
同时:
Console.WriteLine("{0}", (byte)(255.0));
Console.WriteLine("{0}", (byte)(255));
>255
>255
发生了什么事?乘法运算的结果,在二重中的整数的表示难道不应该和并没有相乘的那个表示一样吗?我错过了什么?
表达式
2.55 * 100.0
评估为
254.99999999999997
这意味着当投射到CCD_ 2时的截断产生CCD_。
您应该能够使用将双精度转换为字节
a = Convert.ToByte(b);
这是因为2.55 * 100
不能表示为float
。相反,它的计算结果为254.999999999
,当被截断时,会产生254
。