从double显示只需要的小数

时间:2015-09-03 06:06:32

标签: delphi

我想将double转换为字符串,只显示所需的小数。

所以我不能用

d := 123.4
s := Format('%.2f', [d]);

因为显示结果是123.40,当我想要123.4。

以下是样本和预期结果表

|Double|Result as string|
-------------------------
|5     |5               |
|5.1   |5.1             |
|5.12  |5.12            |
|5.123 |5.123           |

2 个答案:

答案 0 :(得分:2)

您可以使用%g format string

  

常规:参数必须是浮点值。使用fixed或将值转换为最短的十进制字符串   科学的格式。结果中的有效位数   string由格式字符串中的精度说明符给出;一个   如果没有精度说明符,则假定默认精度为15   当下。从结果字符串中删除尾随零和a   小数点仅在必要时出现。结果字符串使用   定点格式,如果小数点左边的位数   值中的点小于或等于指定的精度,   如果该值大于或等于0.00001。否则   结果字符串使用科学格式。

答案 1 :(得分:2)

这并不像你想象的那么简单。这一切都归结为可表示性。

让我们考虑一个0.1的简单示例。该值在double中无法准确表示。这是因为double二进制表示,而不是十进制表示。

double值存储在s*2^e格式中,其中se分别是有效数和指数,都是整数。

返回0.1。该值不能精确表示为二进制浮点值。不存在表示它的有效数和指数的组合。相反,将使用closest representable value

0.10000 00000 00000 00555 11151 23125 78270 21181 58340 45410 15625

如果这令人震惊,我建议以下参考:

那么,该怎么办?一个显而易见的选择是切换到十进制而不是二进制表示。在Delphi中,通常意味着使用Currency类型。取决于您的应用程序可能是一个不错的选择,或者它可能是一个糟糕的选择。例如,如果您希望有效地执行科学或工程计算,则十进制类型不合适。

另一种选择是看看Python如何处理这个问题。 repr函数尽可能生成具有eval(repr(x)) == x属性的字符串。在旧版本的Python repr中生成了1.1000000000000001形式的非常长的字符串,而事实上1.1就足够了。 Python adopted an algorithm,它找到表示浮点值的最短十进制表达式。你可以采用相同的方法。问题在于算法非常复杂。