我正在尝试将Single
转换为Double
,同时保留原始值。我找到了以下方法:
Single f = 5.2F;
Double d1 = f; // 5.19999980926514
Double d2 = Double.Parse(f.ToString()); // 5.2 (correct)
这种做法值得推荐吗?我不需要最优的方法,但是预期的数值必须传递到double中。在将一个四舍五入的值存储到double中是否会有后果呢?
我正在尝试将Single
转换为Double
,同时保留原始值。我找到了以下方法:
Single f = 5.2F;
Double d1 = f; // 5.19999980926514
Double d2 = Double.Parse(f.ToString()); // 5.2 (correct)
这种做法值得推荐吗?我不需要最优的方法,但是预期的数值必须传递到double中。在将一个四舍五入的值存储到double中是否会有后果呢?
你可以使用 "decimal" 代替字符串。
float f = 5.2F;
decimal dec = new decimal(f);//5.2
double d = (double)dec; //5.2
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 位数,所以.NET 只显示 7 位数。稍微四舍五入一下,5.1999998092651368 就是 5.2。double
表示形式。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会提高前一种情况下的准确性,但会降低后一种情况下的准确性。
Single
转换为Double
,因为这些值在某个时候被序列化了。我认为我理解直接将Single
转换为Double
不会有害,但这是一个表现问题。 - toplel32