有没有一种聪明的方法将这样的浮点数转换:
float f = 711989.98f;
如何将一个数字转换为十进制(或double类型),而不会丢失精度?
我已尝试过:
decimal d = (decimal)f;
decimal d1 = (decimal)(Math.Round(f,2));
decimal d2 = Convert.ToDecimal(f);
有没有一种聪明的方法将这样的浮点数转换:
float f = 711989.98f;
如何将一个数字转换为十进制(或double类型),而不会丢失精度?
我已尝试过:
decimal d = (decimal)f;
decimal d1 = (decimal)(Math.Round(f,2));
decimal d2 = Convert.ToDecimal(f);
太晚了,第8位数字已经在编译器中丢失。浮点类型只能存储7个有效数字。你需要重写代码,使用double或decimal赋值来解决问题。
这可能是编译器问题,因为似乎一个有效的浮点数应该能够直接转换为十进制。但是如果直接转换,它将失去精度。 将125.609375从浮点数转换为十进制将会失去精度。 然而,将其从浮点数转换为双精度,然后从双精度转换为十进制将保留精度。
float float_val = 125.609375f;
decimal bad_decimal_val = (decimal)float_val; //125.6094
double double_val = (double)float_val;
decimal good_decimal_val = (decimal)double_val;
decimal.TryParse()
浮点数(float/double)和十进制数(decimal)之间没有隐式转换。隐式数字转换始终保证不会丢失精度或大小,并且不会引发异常。9007199791611905
转换为 double
将产生 9007199791611904
。直接转换为 float
将产生 9007200328482816
。先转换为 double
,然后再转换为 float
将产生 9007199254740992
(比直接转换为 float
的误差更大)。此外,虽然编译器允许从 float
隐式转换为 double
,但这种转换比从 double
转换为 float
更容易出错,尽管后者是不允许的,但应该允许。 - supercatfloat
转换为 double
。但是,将 double
转换为 float
可能会引入错误,具体取决于所涉及的特定 double
值。 - Drew Noakesfloat
类型的图形例程来绘制它,那么将其转换为float
将会减少精度,即使保留精度也通常是无用的;减少精度几乎肯定符合程序员意图。相比之下,如果某些代码例如将int
或long
除以float
并将结果存储在double
中,则除非程序员明确地将除法结果转换为float
,否则我不会认为程序员... - supercatfloat
精度。给定int x = 16777217; float y = 1.0f;
,你认为编写double z = x / y;
的程序员更可能期望z
是16777216.0还是16777217.0?同样地,即使给定float one = 1.0f, ten = 10.0f; double d = one / ten;
,你认为程序员更可能希望d
接收值0.1f还是0.1? - supercat你在写711989.98f时就失去了精度。
711989.98是十进制数。在末尾加上f,你要求编译器将其转换为浮点数。这种转换无法在不损失精度的情况下完成。
你可能想要的是十进制数d = 711989.98m。这样就不会失去精度。
试一下这个
float y = 20;
decimal x = Convert.ToDecimal(y/100);
print("test: " + x);