【发布时间】:2021-05-07 18:13:59
【问题描述】:
我正在寻找以自己的精度递增浮点数的最优化且易于阅读的版本:
increment(1000) should return 1001
increment(100.1) should return 100.2
increment(0.1) should return 0.2
increment(0.01) should return 0.02
increment(0.001) should return 0.002
increment(0.0009) should return 0.0010
increment(0.000123) should return 0.000124
increment(increment(0.0009)) should return 0.002
可以通过字符串操作来完成,但我不想将其转换为字符串并将其解析回双精度。
我对字符串操作做了以下操作:
public static double incrementWithMover(double value){
DecimalFormat df = new DecimalFormat("0", DecimalFormatSymbols.getInstance(Locale.ENGLISH));
df.setMaximumFractionDigits(340); //340 = DecimalFormat.DOUBLE_FRACTION_DIGITS
String valueString = df.format(value);
String[] splitted = valueString.split("\\.");
StringBuilder mover = new StringBuilder();
if(splitted.length == 2){ // Floating Decimals
int precision = splitted[1].length();
df.setMaximumFractionDigits(precision);
mover = new StringBuilder("0.");
for(int i =1; i<precision; i++){
mover.append("0");
}
mover.append("1");
}
else{ // Non Floating Decimals
mover = new StringBuilder("1");
}
double incremented = Double.parseDouble(valueString) + Double.parseDouble(mover.toString());
return Double.parseDouble(df.format(incremented));
}
我正在尝试编写此方法,因为我正在检查不同的值并尝试将所有值以它们自己的精度递增一个
编写这种incrementFloating 方法的最佳方法是什么?
【问题讨论】:
-
如果数字是
.000123,下一个增量应该是多少? -
应该是000124
-
您必须将其保留为字符串。在您的示例中,没有等于 0.1 或 0.2 或任何其他值的双精度值。这个 BigDecimal 类可能会使整个工作变得更容易。
-
incrementFloating(incrementFloating(0.0009))应该返回什么?如果第一个增量返回0.0010,那么第二个增量应该返回0.002还是0.0011? -
应该是
0.002
标签: java math floating-point double precision