Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.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# - Fatal编程技术网

c#将字符串转换为精度损失的两倍

c#将字符串转换为精度损失的两倍,c#,C#,我有以下资料: string value = "9223372036854775807"; double parsedVal = double.Parse(value, CultureInfo.InvariantCulture); 。。。结果是9.2233720368547758E+18,这不是完全相同的数字。如何在不损失精度的情况下将字符串转换为双精度?double只能保证16(大约)位小数的精度。您可以尝试切换到decimal(它有更多的位可供使用,并保持该值有足够的净空)。由于双精度((

我有以下资料:

string value = "9223372036854775807";
double parsedVal = double.Parse(value, CultureInfo.InvariantCulture);

。。。结果是
9.2233720368547758E+18
,这不是完全相同的数字。如何在不损失精度的情况下将字符串转换为双精度?

double
只能保证16(大约)位小数的精度。您可以尝试切换到
decimal
(它有更多的位可供使用,并保持该值有足够的净空)。

由于双精度(()二进制浮点运算的标准)的定义,您无法将9223372036854775807转换为而不损失精度


默认情况下,双精度值包含15位小数精度, 尽管内部最多保留17位数字


使用十进制将获得此处所需的精度。但是请注意,十进制数的存储范围与双精度数的存储范围不同


请参见

Try
System.Convert.ToDouble
答案是:使用较短的字符串。双打没有无限的精确性;在一个双精度存储器中可以存储的最大奇数只有16位。或者,也许更现实一点,将其转换为ulong而不是double。@xbonez-havet'cehcked在一段时间内,但非常确定这只是相同内容的快捷方式。默认情况下,double值包含15位精度的小数位数,虽然内部最多保留17位。@Mitch最终还是受到IEEE 754定义的限制,但为什么?我希望能够解析从double.MinValue到double.MaxValue的任何double。如果我们有9223372036854775807的值,为什么我不能从字符串中获取它?如果不是指数表示法就可以了。@marc:既然double符合这一点,是的。@user是的,但它只给出了该范围内的保真度;根据IEEE 754的定义,其精度有限。它会将其解析为它能表示的最接近的值。Re“存储容量”-一个
十进制
实际上不止一个
双精度
-表示不同,但它是一个96位的数字