在将算法从 JavaScript 移植到 Java 时,我遇到了需要替换 JavaScript 的 toPrecision() 的问题。问题是我不知道数字有多大或多小,所以我不能使用具有正确格式的简单 NumberFormat 。
是否有提供类似功能的标准类?
编辑这是我想出的:
double toPrecision(double n, double p) {
if (n==0) return 0;
double e = Math.floor(Math.log10(Math.abs(n)));
double f = Math.exp((e-p+1)*Math.log(10));
return Math.round(n/f)*f;
}
原则上,它做正确的事,但舍入错误完全毁了它。例如,
toPrecision(12.34567, 3)
返回12.299999999999997
编辑 2 这个版本非常适用于 12 个测试用例中的 11 个......
double toPrecision(double n, double p) {
if (n==0) return 0;
double e = Math.floor(Math.log10(Math.abs(n)));
double f = Math.round(Math.exp((Math.abs(e-p+1))*Math.log(10)));
if (e-p+1<0) {
f = 1/f;
}
return Math.round(n/f)*f;
}
但toPrecision(0.00001234567, 3)
仍然返回1.2299999999999999E-5
而不是1.23E-5