我尝试将Single
转换为Double
,同时保持原始值。我找到了以下方法:
Single f = 5.2F;
Double d1 = f; // 5.19999980926514
Double d2 = Double.Parse(f.ToString()); // 5.2 (correct)
这种做法值得推荐吗?我不需要最佳方法,但必须将预期值传递给double。将双舍五入的值存储在双倍中是否会产生后果?
答案 0 :(得分:5)
转换是准确的。所有Single
值都可以用Double
值表示,因为它们以相同的方式“构建”,只有更多可能的数字。您认为 5.2F 的内容实际上是5.1999998092651368
。如果您转到http://www.h-schmidt.net/FloatConverter/IEEE754.html并插入 5.2 ,您会看到它的指数 2 ^ 2 (所以 4 )和 1.2999999523162842 的尾数。现在,如果你将两个数字相乘,你将获得 5.1999998092651368 。
Single
的最大精度为7 digits,因此.NET仅显示7位数。稍微舍入 5.1999998092651368 5.2
答案 1 :(得分:4)
您可以使用“decimal”而不是字符串。
float f = 5.2F;
decimal dec = new decimal(f);//5.2
double d = (double)dec; //5.2
答案 2 :(得分:0)
如果你知道你的号码是例如0.01,我建议你转换为double,舍入到最接近的整数,并减去它以获得分数残差。将其乘以100,舍入为最接近的整数,然后除以100.将其添加到整数部分,以使最接近的double
表示形式为0.01的倍数,即最接近原始数字。
请注意,根据最初来自float
值的位置,此类处理可能会也可能不会提高准确性。与9000.02最接近的float
值约为9000.019531,与9000.021最接近的float
值约为9000.021484f。如果通过将9000.020和9000.021转换为float
来达到这些值,则它们之间的差异应为0.01。但是,如果它们是通过例如计算9000f+0.019531f
和9000f+0.021484f
,那么它们之间的差异应该接近0.02。在减法之前舍入到最接近的0.01将提高前一种情况下的准确性并在后者中降低它。