Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#浮点到十进制的转换_C#_Floating Point_Precision - Fatal编程技术网

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之类的十进制文字。