C#浮点到十进制的转换
任何转换浮点值的智能方法如下:C#浮点到十进制的转换,c#,floating-point,precision,C#,Floating Point,Precision,任何转换浮点值的智能方法如下: float f = 711989.98f; 在不损失精度的情况下转换为十进制(或双精度) 我试过: decimal d = (decimal)f; decimal d1 = (decimal)(Math.Round(f,2)); decimal d2 = Convert.ToDecimal(f); 你试过了吗 decimal.TryParse() 浮点/双精度和十进制之间没有隐式转换。隐式数字转换始终保证不会丢失精度或大小,并且不会导致异常 太晚了,第8位
float f = 711989.98f;
在不损失精度的情况下转换为十进制(或双精度)
我试过:
decimal d = (decimal)f;
decimal d1 = (decimal)(Math.Round(f,2));
decimal d2 = Convert.ToDecimal(f);
你试过了吗
decimal.TryParse()
浮点/双精度和十进制之间没有隐式转换。隐式数字转换始终保证不会丢失精度或大小,并且不会导致异常
太晚了,第8位数字在编译器中丢失了。浮点类型只能存储7位有效数字。您必须重写代码,将其指定为double或decimal当然可以解决问题。您在编写711989.98f时就失去了精度 711989.98是十进制数。最后是f,要求编译器将其转换为float。如果不降低精度,则无法进行此转换
您可能想要的是十进制d=711989.98m。这不会丢失精度。这可能是一个编译器错误,因为似乎有效的浮点应该直接转换为十进制。但它不会失去决心。 将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;
更多细节:我正在与一个旧的Web服务交互,它发送这个巨大的对象,其中有一些字段作为float。当我转换成十进制卡布姆的时候…再也没有硬币了!如果这是来自网络上的web服务,那么它可能是XML,这意味着没有浮点数或小数,只有字符串。查看这些字符串转换为“内部”格式的位置感谢我将映射对象上的字段类型从float更改为decimal,并解决了反序列化过程中发生的转换问题。隐式转换不能保证不会丢失精度。将
9007199791611905
转换为double
将产生9007199791611904
。直接转换为float
将产生9007200328482816
。转换为double
然后再转换为float
将产生9007199254740992
(该值比直接转换为float
时关闭的值大)。此外,虽然编译器允许从float
到double
的隐式转换,但这种转换比从double
到float
的转换更可能出错,后者是不允许的,但应该是正确的。但是,根据所讨论的特定double
值,将double
转换为float
可能会引入错误。@DrewNoakes:如果使用类型double
进行迭代计算来计算对象的位置,然后希望使用接受float
的图形例程来绘制,转换为float
将降低精度,即使保留精度,通常也是无用的;去掉精度几乎肯定与程序员的意图一致。相比之下,如果某些代码(例如,将int
或long
除以float
),并将结果存储在double
中,那么,除非程序员明确地将除法的结果转换为float
,否则我不会假定程序员……实际上打算只以float
精度执行除法。给定intx=16777217;浮动y=1.0f代码>你认为编写双z=x/y
是否期望z
为16777216.0或16777217.0?因此,即使给定floatone=1.0f,ten=10.0f;双d=1/10
,你认为程序员更可能希望d
得到0.1f或0.1的值吗?@supercat,我明白你的意思。我来问这个问题是为了寻找有关从浮点/双精度转换为十进制时精度损失的信息(我正在考虑允许在反序列化程序中进行此转换,以便模式可以以这种方式演变),因此主要关注单个转换过程中的精度损失。因此,我的评论是正确的。您的观点是有趣和有效的,尽管通过仔细选择浮点类型,我意识到并避免了一个陷阱。我不太熟悉十进制,尤其是浮点数的wrt转换。您的示例只使用了双精度,对吗?对于不同的数字,它仍然可能会失去精度。只需在末尾加上一个“m”,并使文字以十进制开头。从float转换为double不会神奇地增加丢失的小数位数。只需使用末尾不带“f”的浮点文字(这些是双精度的),或使用125.609375M之类的十进制文字。