对于通用¹解决方案,您需要保留339个位置:
doublevalue.ToString("0." + new string('#', 339))非零十进制数字的最大数目为16。15在小数点的右侧。指数最多可以将那15个数字向右移动324个位。(请参阅范围和精度。)
它的工作原理为
double.Epsilon,
double.MinValue,
double.MaxValue,和任何之间。
由于所有格式和字符串工作都是由非托管CLR代码一次性完成的,因此性能将比正则表达式/字符串处理解决方案好得多。而且,代码更容易证明正确。
为了易于使用并获得更好的性能,请使其恒定:
public static class FormatStrings{ public const string DoubleFixedPoint = "0.###################################################################################################################################################################################################################################################################################################################################################";}¹ 更新:
我错误地说这也是一种无损解决方案。实际上并非如此,因为
ToString除以外的所有格式的常规显示都会舍入
r。现场示例。谢谢,@讨厌!如果您需要以定点表示法往返的功能(即,如果您今天正在使用),请参阅Lothing的答案
.ToString("r")。


