C#float到十进制转换

时间:2010-04-07 18:12:13

标签: c# floating-point precision

任何以这种方式转换浮点数的聪明方法:

float f = 711989.98f;

成十进制(或双精度)而不会丢失精度?

我试过了:

decimal d = (decimal)f;
decimal d1 = (decimal)(Math.Round(f,2));
decimal d2 = Convert.ToDecimal(f);

4 个答案:

答案 0 :(得分:12)

为时已晚,第8位数字在编译器中丢失了。 float类型只能存储7位有效数字。你必须重写代码,分配给double或decimal当然会解决问题。

答案 1 :(得分:3)

这可能是一个编译器错误,因为它似乎是一个有效的float应该直接转换为十进制。但它不会失去决心。 将125.609375从float转换为十进制将失去分辨率。 但是,将它从float转换为double然后再转换为double将保持分辨率。

    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;

答案 2 :(得分:1)

你尝试过吗?

decimal.TryParse()

http://forums.asp.net/t/1161880.aspx

  

float / double和decimal之间没有隐式转换。隐式数字转换始终保证不会丢失精度或幅度,并且不会导致异常。

答案 3 :(得分:1)

你写完711989.98f的那一刻就失去了精确度。

711989.98是十进制的。最后使用f,您要求编译器将其转换为float。在不失去精度的情况下无法完成此转换。

你可能想要的是小数d = 711989.98m。这不会失去精确度。