我想格式化一个浮点数,使其最多有 3 个小数位,但如果最后一个小数位为 0,则忽略它们。
input : expected output
1.1234 : 1.123
1.120 : 1.12
1.100 : 1.1
1.0 : 1
只要使用标准格式的 C 字符串,即:“%.3f”,语言并不重要
我想出的解决方案:
function formatShortFloat(value as Float) as String {
var str = value.format("%.3f");
var chars = str.toCharArray();
var end;
for (end = str.length() - 1; chars[end] == '0' && end > 0; --end) {
}
if (chars[end] == '.') {
--end;
}
return str.substring(0, end + 1) as String;
}
或者(注意,这是 Monkey C,没有更简单的方法来访问字符串的字符,但这是我的问题,这就是为什么我要求“任何语言”,甚至是伪代码):
function formatShortFloat(value as Float) as String {
var str = value.format("%.3f");
var end = str.length();
var lastChar;
do {
lastChar = str.substring(end - 1, end);
--end;
} while ("0".equals(lastChar));
if (".".equals(lastChar)) {
--end;
}
return str.substring(0, end + 1) as String;
}
假设您总是想要 3 个小数位(除非它们为零)并且您的格式函数与 C99
printf
/sprintf
兼容,您可以使用 %.*g
格式化程序并提供所需的总位数作为额外的数量争论。假设你输入的数字不小于0.001
,那么你需要传递的数字是(int)(log10(x)+4.0)
。如果出现较小的值,我建议根据 "+/-0.001"
手动返回 "0"
或 x
。
概念验证(在 C 语言中,带有一些调试输出以进行比较 - 您可以删除从
\t
开始的所有内容以及额外的 x
):
void println(double x)
{
printf("%.*g\t= %.99g\n", (int)(log10(fabs(x))+4.0), x, x);
}
Godbolt-Demo 以及一些测试用例:https://godbolt.org/z/zsxns4h9v