确保十进制数字的字符串代表总是n个字符长

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

我需要确保我的所有十进制数字始终最多为15个字符(包括点),同时保持尽可能高的精度。因此,最大长度为15个字符,包括“。”。科学表示法的“ E”和“-”。

我当时的想法是对大数使用科学计数法,对小数使用四舍五入。

例如,对于1234567891234567.123456789,我将使用科学计数法,但是对于0.123456789123456789,我将对其进行四舍五入。

我正在寻找可以为我完成此工作的Java库,但是找不到让我指定表示形式的字符总数的任何库。

感谢任何建议或指示。

编辑:更多的想法-使用24000E-18可以毫无损失地表示一个诸如0.000000000000024的数字。例如,尽管0.123456789123424必须遭受一些损失,但是这当然使得编写任何类型的简单分支算法变得更加困难。

EDIT2:我们用于传输数据的格式为字母数字,并将数据限制为总共15个字符。我必须编写代码来满足格式要求,以便可以在不触发格式错误的情况下传输数据,但仍要在限制范围内保持最大精度。

java string-formatting number-formatting decimalformat
1个回答
0
投票

我首先检查将精度降低到15会发生什么。如果导致String太长,我会用差值更改精度。也许它将为您工作。

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.math.MathContext;

public class testing7 {
  public static void main(final String[] args) {
    System.out.println("-> 1------------15");  //  15 Char
    System.out.println("123456789012345: \n-> " 
                         + stringConversion(123456789012345d));
    System.out.println("1.3456789012345: \n-> "
                         + stringConversion(1.3456789012345));
    System.out.println("0.123456789123456789: \n-> "
                         + stringConversion(0.123456789123456789));
    System.out.println("1234567891234567.123456789 \n-> "
                         + stringConversion(1234567891234567.123456789));
    System.out.println("-1234567891234567.123456789: \n-> " 
                         + stringConversion(-1234567891234567.123456789));
    System.out.println("0.000000000000024: \n-> " 
                         + stringConversion(0.000000000000024));
    System.out.println("1234567891234567985746372854324.000000000000024: \n-> "
                         + stringConversion(1234567891234567985746372854324.000000000000024));
  }

  public static String stringConversion(Double d){
    BigDecimal decimal = BigDecimal.valueOf(d); // For precision use new BigDecimal(String ..)

    MathContext context = new MathContext(15, RoundingMode.HALF_UP);
    decimal = decimal.round(context);

    String s = decimal.toString();
    int diff = s.length() - 15;

    if (diff <= 0) {
      return s;
    } else {
      context = new MathContext(15-diff, RoundingMode.HALF_UP);
      decimal = decimal.round(context);
      return decimal.toString();
    }
  }
}

结果:

-> 1------------15
123456789012345:
-> 123456789012345
1.3456789012345:
-> 1.3456789012345
0.123456789123456789:
-> 0.1234567891235
1234567891234567.123456789
-> 1.234567891E+15
-1234567891234567.123456789:
-> -1.23456789E+15
0.000000000000024:
-> 2.4E-14
1234567891234567985746372854324.000000000000024:
-> 1.234567891E+30
© www.soinside.com 2019 - 2024. All rights reserved.