如何格式化浮点数以省略分数末尾的零

问题描述 投票:0回答:1

我想格式化一个浮点数,使其最多有 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;
}
floating-point format precision string-formatting monkeyc
1个回答
0
投票

假设您总是想要 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

© www.soinside.com 2019 - 2024. All rights reserved.