我想将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 |
答案 0 :(得分:2)
您可以使用%g
format string:
常规:参数必须是浮点值。使用fixed或将值转换为最短的十进制字符串 科学的格式。结果中的有效位数 string由格式字符串中的精度说明符给出;一个 如果没有精度说明符,则假定默认精度为15 当下。从结果字符串中删除尾随零和a 小数点仅在必要时出现。结果字符串使用 定点格式,如果小数点左边的位数 值中的点小于或等于指定的精度, 如果该值大于或等于0.00001。否则 结果字符串使用科学格式。
答案 1 :(得分:2)
这并不像你想象的那么简单。这一切都归结为可表示性。
让我们考虑一个0.1
的简单示例。该值在double
中无法准确表示。这是因为double
是二进制表示,而不是十进制表示。
double
值存储在s*2^e
格式中,其中s
和e
分别是有效数和指数,都是整数。
返回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,它找到表示浮点值的最短十进制表达式。你可以采用相同的方法。问题在于算法非常复杂。