float转string的位数是怎么确定的?
How are the number of digits in float to string conversion determined?
我有一个 GitHub issue 请求在从浮点值到字符串的转换过程中舍入错误被截断。摘录:
System.Quadruple quad = 5.099;
Console.WriteLine(quad);
输出:
5.099000000000000198951966012828052
我可以猜到一个天真的实现,但我假设有一些商定的方式来决定应该显示多少位数字。算法是什么? The code in question.
@Brent:我上面的评论可能是您的(部分)答案(我是事后才读到这个问题 - 抱歉)。 csprogrammer001 的问题是他(她)没有意识到从双倍提升到四倍的含义。在 double 5.099(...~12digits...)0 和 double 5.099(...~12digits...)1 之间存在另一个 ~999...9(17 个十进制 9s)有效四值。
为了更接近他们应该做类似 Quad.Parse("5.09900000000000000000000000000000") 之类的事情,或者明确截断您的字符串以匹配他们的有效数字。
如果将双精度值插入四元组(未分配的位为零)得到 near-as-dammit 5.09900000000000019895196601282(8052) 那么这就是您应该渲染的(至少 30 个十进制数字基于 .Net 的默认值 15)。你唯一可以考虑 "fix" 的例子是 "guess intention" 像 double->round->string->pad->quad 这样的东西,你不想那样做。
ToString() 的格式化选项将是一个很好的补充。
我有一个 GitHub issue 请求在从浮点值到字符串的转换过程中舍入错误被截断。摘录:
System.Quadruple quad = 5.099;
Console.WriteLine(quad);
输出:
5.099000000000000198951966012828052
我可以猜到一个天真的实现,但我假设有一些商定的方式来决定应该显示多少位数字。算法是什么? The code in question.
@Brent:我上面的评论可能是您的(部分)答案(我是事后才读到这个问题 - 抱歉)。 csprogrammer001 的问题是他(她)没有意识到从双倍提升到四倍的含义。在 double 5.099(...~12digits...)0 和 double 5.099(...~12digits...)1 之间存在另一个 ~999...9(17 个十进制 9s)有效四值。
为了更接近他们应该做类似 Quad.Parse("5.09900000000000000000000000000000") 之类的事情,或者明确截断您的字符串以匹配他们的有效数字。
如果将双精度值插入四元组(未分配的位为零)得到 near-as-dammit 5.09900000000000019895196601282(8052) 那么这就是您应该渲染的(至少 30 个十进制数字基于 .Net 的默认值 15)。你唯一可以考虑 "fix" 的例子是 "guess intention" 像 double->round->string->pad->quad 这样的东西,你不想那样做。
ToString() 的格式化选项将是一个很好的补充。