首页 > 解决方案 > 浮点数到字符串转换的位数是如何确定的?

问题描述

我有一个 GitHub问题,要求在从浮点值转换为字符串期间截断舍入错误。摘录:

System.Quadruple quad = 5.099;
Console.WriteLine(quad);

输出:

5.099000000000000198951966012828052

我可以猜测一个幼稚的实现,但我认为有一些商定的方式来决定应该显示多少位数。算法是什么?有问题的代码

标签: c#c++-clinumber-formatting

解决方案


@Brent:我上面的评论可能是(部分)你的答案(我认为这个问题是事后才想到的 - 道歉)。csprogrammer001 的问题是(s)他没有意识到从双重提升到四重的影响。在 double 5.099(...~12digits...)0 和 double 5.099(...~12digits...)1 之间存在另一个 ~999...9(17 个十进制 9)有效的四边形值。

为了更接近他们应该做类似 Quad.Parse("5.09900000000000000000000000000000") 或明确截断您的字符串以匹配其有效数字。

如果将双精度值插入四边形(未分配的位为零)接近该死的 5.09900000000000019895196601282(8052),那么这就是您应该呈现的内容(基于 .Net 的默认值 15,至少 30 个十进制数字)。您唯一可以考虑“修复”该示例的方法是使用诸如 double->round->string->pad->quad 之类的“猜测意图”,而您不想这样做。

ToString() 的格式化选项将是一个不错的补充。


推荐阅读