2010-04-07 75 views
9

任何聪明的方式为float这样的转换:C#浮点十进制转换

float f = 711989.98f; 

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

我已经试过:

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

更多细节: 我与旧Web服务发送,有一些领域浮法这个庞大的对象的接口。当我做转换为十进制kaboom ...没有更多的便士! – Adrian4B 2010-04-07 18:32:00

+0

如果这是来自网络上的Web服务,它可能是XML,这意味着没有浮点或小数 - 只是字符串。查看这些字符串转换为“内部”格式的位置 – mfeingold 2010-04-07 18:52:08

回答

11

太迟了,第8位数字在编译器中丢失了。浮点类型只能存储7位有效数字。你将不得不重写代码,分配给双精度或十进制将解决问题。

+0

谢谢 我已将映射对象上的字段类型从float更改为decimal,并解决了反序列化期间发生的转换问题。 – Adrian4B 2010-04-08 01:32:03

1

你试过吗?

decimal.TryParse() 

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

有浮子之间/双和十进制没有隐式转换。隐式数字转换始终保证不会导致精度或数量级的损失,并且不会导致异常。

+1

隐式转换不保证不会失去精度。将'9007199791611905'转换为'double'将产生'9007199791611904'。直接转换为“float”将产生“9007200328482816”。转换为“double”,然后转换为“float”将产生“9007199254740992”(与直接转换为“float”的情况相比,关闭的次数更多)。此外,尽管编译器允许从“float”到“double”的隐式转换,但这种转换比从“double”到“float”的转换更可能是错误的,这是不允许但应该是的。 – supercat 2012-09-19 21:59:16

+1

@supercat显然[你可以无损地将'float'转换为'double'](http://stackoverflow.com/q/40550861/24874)。然而,将'double'转换为'float'可能会引入错误,具体取决于具体的“double”值。 – 2016-11-18 00:16:54

+0

@DrewNoakes:如果使用迭代计算来使用'double'类型来计算对象的位置,然后希望使用接受'float'的图形例程来绘制它,那么转换为'float'会降低通常会即使保留也无用;削减精度几乎肯定会符合程序员的意图。相反,如果一些代码例如用'float'分隔'int'或'long'并将结果存储在'double'中,除非程序员明确地将分割结果转换为'float',否则我不会假定程序员... – supercat 2016-11-18 00:51:18

1

您在写完711989.98f的那一刻就失去了准确性。

711989.98是十进制的。 f最后你要求编译器将它转换为浮点。这种转换不能在不失去精确度的情况下完成。

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

+0

你的例子只是使用双精度,对不对?它仍然可能失去其他数字的精度。只需在末尾加上“m”,并将字面量化为小数点即可。 – 2013-01-10 02:51:06

1

这可能是一个编译器错误,因为它看起来像一个有效的浮点数应该直接转换为小数。但它不会失去分辨率。 将125.609375从浮点型转换为十进制型将失去分辨率。 但是,将其从float转换为double,然后将double转换为decimal可以保持分辨率。

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;