Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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
.net 如何用尽可能多的有效数字格式化双精度?_.net_Formatting_Floating Point_Tostring_Number Formatting - Fatal编程技术网

.net 如何用尽可能多的有效数字格式化双精度?

.net 如何用尽可能多的有效数字格式化双精度?,.net,formatting,floating-point,tostring,number-formatting,.net,Formatting,Floating Point,Tostring,Number Formatting,我想用尽可能多的数字格式化一个双精度值,以保持相同的值。 我不想使用指数表示法,因为字符串的接收器需要浮点表示法 示例: 12.0 -> "12" 12.20300 -> "12.203" 编辑: 这似乎是我所需要的。至少对于我测试的数字来说,它的效果与预期一样。您可以使用自定义格式字符串来告诉格式化程序以您想要的方式打印它。在本例中,您希望使用一个修饰符,修饰符的行为0。。此格式化程序本质上指定数字在小数点前至少有一位,在小数点后最多(但不一定)有十六位。不幸的是,您必须有一个最

我想用尽可能多的数字格式化一个双精度值,以保持相同的值。 我不想使用指数表示法,因为字符串的接收器需要浮点表示法

示例:

12.0 -> "12"
12.20300 -> "12.203"
编辑: 这似乎是我所需要的。至少对于我测试的数字来说,它的效果与预期一样。

您可以使用自定义格式字符串来告诉格式化程序以您想要的方式打印它。在本例中,您希望使用一个修饰符,修饰符的行为
0。
。此格式化程序本质上指定数字在小数点前至少有一位,在小数点后最多(但不一定)有十六位。不幸的是,您必须有一个最大值,由
#
符号的数量表示,但16应该足够了

String.Format("{0:0.################}", 12.20300);
本次比赛非常接近,但在使
cDbl(格式(x),0.0.本次比赛在本次比赛中,本次比赛在本次比赛中,本次比赛在本次比赛中是非常接近的,但在使
cDbl(格式(x),0.0)格式(格式(x,0.0)的)cDbl(格式(格式(x),0.0)的
cDbl(格式(格式(格式(x,0)0.0.0)的)的
CDBLBLBLBLBLBLBLBL(格式(格式(格式(格式(格式(x,0,0,0.0.0))的)的)的)的)的重要数字之后的重要数字之后有一些非零零零零垃圾后后有一些非零垃圾后的非零垃圾后有一些非零垃圾后有一些非零垃圾后的无无无无无无无无无无无无无无无无无无无无无无无无无无无无无##”)x
用于大多数分数

通过这种方式,您可以在小数点右侧获得更多的数字,但这并不实际(因为它们是垃圾数字),并且可能不是您想要的:

For i = 1 To ndigits
  s = s & Math.Floor(x * (10 ^ i)) Mod 10
Next i

即使这样,您也可能无法将double转换为string,再转换回double,并使它们相等。我所知道的唯一方法是科学记数法或十六进制。

这真的不可能做到。不管怎么说,都不平凡,也不使用双倍的
。double没有足够的数字来显示任何数字,这可能就是为什么在调用.ToString()时使用科学记数法来显示值的原因

我们得到的双精度输出是用科学记数法表示的,因为它更能代表数值。以这段代码为例

    double testValue = 9123456789012345678.234;
    string formatStr = "{0:0.####################################################},{1}";
    Debug.WriteLine(String.Format(formatStr, testValue, testValue));
我们得到的结果是:

9123456789012350000,9.123456788901235E+18

这两个数字都不是我们开始时的实际数字。如果你忽略了非常大的数字,我想你会发现你发布的示例并不要求你做任何事情

 Debug.WriteLine(12.0d + " == " + String.Format("{0} == {1:0.########################}",  12.0d, 12.0d));
 Debug.WriteLine(12.20300d + " == " + String.Format("{0} == {1:0.########################}", 12.20300d, 12.20300d));
 Debug.WriteLine(-00.2900d + " == " + String.Format("{0} == {1:0.########################}", -00.2900d, -00.2900d));
 Debug.WriteLine(99999999999999999999999d + " == " + String.Format("{0} == {1:0.########################}", 99999999999999999999999d, 99999999999999999999999d));


12 == 12 == 12
12.203 == 12.203 == 12.203
-0.29 == -0.29 == -0.29
1E+23 == 1E+23 == 100000000000000000000000

在前三个示例中,无论是使用WriteLine直接显示,都可以使用String.Format而不使用格式字符串,或者使用“0.”输出。值不同的唯一情况是在第四种情况下,默认行为是显示科学符号。改变这种行为会给你一些额外的零,你期望有意义的数字;但是它可以像Samir用格式字符串显示的那样完成。

为什么不能使用
printf(“%d”)
?据我所知,它不会将任何尾随或前导零放在双精度上。因为上次我检查时,C不是受支持的CLR语言:)@cody,它似乎
double。ToString()
已经省略了尾随的0,或者您发现不同吗?或者您可能正在使用另一种类型,例如
decimal
?我已删除我的答案,等待更多信息。@Anthony Pegram:double.ToString()在某些情况下可能返回指数表示法,这不是我想要的。您正在与要求将浮点值格式化为字符串的代码进行互操作?那不可能是对的。。。