从双精度到字节的转换会产生意外的结果

本文关键字:意外 结果 转换 双精度 到字节 | 更新日期: 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