让我们考虑一个场景:我们的程序中有一个双变量,表示字节值的百分比。经过一些操作后,我们将简单的范围转换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
发生了什么事?作为乘法结果的double中的整数表示不应该与未乘以的整数表示相同吗?我错过了什么?
答案 0 :(得分:4)
表达式
2.55 * 100.0
评估为
254.99999999999997
表示转换为byte
时截断会产生254
。
答案 1 :(得分:4)
您应该可以使用
将double转换为一个字节a = Convert.ToByte(b);
答案 2 :(得分:1)
这是因为2.55 * 100
无法表示为float
。相反,它会评估为254.999999999
,当被截断时,会产生254
。