使用逗号将浮点数转换为字符串无舍入或小数更改

时间:2018-03-07 04:16:38

标签: java floating-point formatting format

我正在尝试将float转换为String并将逗号插入到生成的String中。我不想添加/删除任何零,更改浮动的精度,或进行任何类型的舍入。我希望String结果与原始浮点数完全相同,只需添加逗号。区域性不可知解决方案将是首选。

我需要什么:

public String convertFloat(float number) {
    // return converted String with commas and no rounding or extra digits
}

一些输入/输出示例:

鉴于浮动:1500

结果:" 1,500"

给定浮动:0.00210014

结果:" 0.00210014"

给定浮动:168874.00210014

结果:" 168,874.00210014"

鉴于浮动:168874.01

结果:" 168,874.01"

我尝试过的事情:

String.valueOf(168874.00210014f) // Does not work for me because the result does not contain commas

String.format("%,f", 10.2f) // Does not work for me because it inserts a bunch of zeroes on the end

// The below does not work for me because the precision gets thrown off and the result ends up being: 14.1999998093 When it should be just: 14.2
NumberFormat f = NumberFormat.getInstance();
f.setMaximumFractionDigits(10);
System.out.println(f.format(14.2f));
// Result: 14.1999998093

// The below does not work for me because a bunch of random extra digits get thrown onto the end
DecimalFormat f = new DecimalFormat("#,###.##########");
System.out.println(f.format(100514.2f));
// Result: 100,514.203125

// The below does not work for me because it rounds to 2 decimal places
DecimalFormat f = new DecimalFormat("#,###.00");
System.out.println(f.format(100514.21351f));
// Result: 100,514.203125

// Does not work for me because it rounds to 2 decimal places.
String s = String.format("%,.2f", 10.2629f)

我想做的事情似乎很简单。如何在结果字符串中添加逗号来获得完全相同的数字?

5 个答案:

答案 0 :(得分:1)

认识到float 7位小数精度 - 非常重要,因为十进制数字可以'无法准确表达。

您的示例值100514.213512345f不会以您放入的方式返回,因为原始值必然会被截断为100514.2附近某处的某个值

我知道你不想要任何舍入,但它是计算机上浮点数学的本质。即使你使用双精度,你也只是缩小了圆角 - 圆角的问题不会消失。

答案 1 :(得分:0)

默认为6位数。

我找到的指针很少: -

  1. Float正在扭曲十进制之后的值,而double则不是。因此,建议使用double。

  2. 在原始数字中,不可能显示小数点后的数字。因此,下面是一个解决方法:

    String string = String.format("%,.6654f", Math.abs(n)).replaceAll("0*$", "")
    
  3. n是双数而不是浮点数。

    我已经使用6654作为随机最大十进制数字,如果需要,可以增加数字。

答案 2 :(得分:0)

这是一种黑客攻击,但你可以替换前面的零

thankForLogginln

至于大数字的精确度,你应该使用String.format("%,f", 10.2f).replaceAll("0*$","") 此外,如果其圆数

,您可以删除最后一个点
BigDecimal

答案 3 :(得分:0)

OP, 这些答案都不适合我。事实证明,在我的情况下,转换为double是不可能的。所以我决定牺牲逗号,然后选择String.valueOf()方法

答案 4 :(得分:0)

承认其他人已经发布的有关浮动中允许的数字数量有限的内容,这里有一个版本,当你在限制范围内时应该可以工作,并且如果它们属于正确属性,则不会删除连续的0漂浮。我们基本上只是将输入分成2个子串并将逗号格式添加到上半部分。

    String input = String.valueOf(number);
    int decimalIndex = input.indexOf(".");
    String firstHalf = input.substring(0, decimalIndex);
    String secondHalf = input.substring(decimalIndex, input.length());
    String commas = String.format("%,d", Integer.parseInt(firstHalf));
    return commas + secondHalf;

如果你想保持更高的精确度,那么请使用双打而不是花车。