一尘不染

无科学记数的双字符串转换

c#

.NET Framework中如何在没有科学符号的情况下将双精度转换为浮点字符串表示形式?

“小”样本(有效数字可以是任何大小,例如1.5E2001e-200):

3248971234698200000000000000000000000000000000
0.00000000000000000000000000000000000023897356978234562

没有一种标准的数字格式是这样的,而且自定义格式似乎也不允许在小数点分隔符后使用开放的数字位数。

这不是重复如何双转换为字符串没有权力代表10(E-05)
,因为那里给出的答案也 不会
在手解决问题。这个问题可接受的解决方案是使用固定点(例如20位数字),这不是我想要的。定点格式和修剪冗余0不能解决问题,因为固定宽度的最大宽度为99个字符。

注意: 解决方案必须正确处理自定义数字格式(例如,其他小数点分隔符,具体取决于区域性信息)。

编辑: 问题实际上只是关于替换上述数字。我知道浮点数是如何工作的,以及可以使用和计算哪些数字。


阅读 169

收藏
2020-05-19

共1个答案

一尘不染

对于通用¹解决方案,您需要保留339个位置:

doubleValue.ToString("0." + new string('#', 339))

非零十进制数字的最大数目为16。15在小数点的右侧。指数最多可以将那15个数字向右移动324个位。(请参阅范围和精度。

它的工作原理为double.Epsilondouble.MinValuedouble.MaxValue,和任何之间。

由于所有格式和字符串工作都是由非托管CLR代码一次性完成的,因此性能将比正则表达式/字符串处理解决方案好得多。而且,代码更容易证明正确。

为了易于使用并获得更好的性能,请使其恒定:

public static class FormatStrings
{
    public const string DoubleFixedPoint = "0.###################################################################################################################################################################################################################################################################################################################################################";
}

¹ 更新:
我错误地说这也是一种无损解决方案。实际上并非如此,因为ToString除以外的所有格式的常规显示都会舍入r现场示例。谢谢,@讨厌!如果您需要以定点表示法往返的功能(即,如果您今天正在使用),请参阅Lothing的答案.ToString("r")

2020-05-19