【发布时间】:2020-04-27 23:54:13
【问题描述】:
我需要确保我的所有十进制数字的长度始终最多为 15 个字符(包括点),同时尽可能保持精度。因此,它必须最多为 15 个字符,包括“.”。科学记数法的“E”和“-”。
我的想法是对大数使用科学计数法,对小数使用四舍五入。
例如,对于 1234567891234567.123456789,我会使用科学计数法,但对于 0.123456789123456789,我会四舍五入。
我寻找可以为我执行此操作的 java 库,但我找不到任何可以让我指定表示的字符总数的库。
感谢任何建议或指点。
编辑:更多想法 - 使用 24000E-18 可以无损失地表示 0.000000000000024 等数字。虽然例如 0.123456789123424 必须遭受一些损失,但这当然会使编写任何类型的简单分支算法变得更加困难。
EDIT2:我们用于传输数据的格式是字母数字格式,并将数据限制为总共 15 个字符。我必须编写代码来满足格式要求,这样才能在不触发格式错误的情况下传输数据,但仍要在限制范围内保持最大精度。
EDIT3:我正在使用它来测试我的功能,但到目前为止,在许多情况下一切都失败了:
Random rnd = new Random();
double n = 100000 + rnd.nextDouble() * 900000;
String res;
double rangeMin = -123456789123456D;
double rangeMax = 123456789123456D;
String val;
for (int i=1;i<=1000;i++) {
n = rangeMin + (rangeMax - rangeMin) * rnd.nextDouble();
val = Double.toString(n);
res = shorteningFunction(val);
System.out.println(val + " " + val.length() + " " + res + " " + res.length());
}
【问题讨论】:
-
你应该使用
BigDecimal然后设置你想要的精度。 -
@TimBiegeleisen 精度似乎不处理字符,而是处理数字。也许我错过了它,但我看不到如何限制字符总数?你介意重新打开我的问题吗,这似乎没有答案?
-
数字不是单个字符吗?
-
@TimBiegeleisen 确实是,但它不计算点字符,或使用科学计数法时的“E”。
-
有这个要求是没有意义的。这是否意味着并非所有数字都将以相同的精度存储?你真的想要吗?
标签: java string-formatting number-formatting decimalformat