我已经阅读了其他一些帖子,它们似乎适用于其他人,但是当我试用它们时,它们无法工作。我刚开始学习编程Java,我似乎无法理解如何舍入小数。
我试过
answer = input * input;
answer = answer*1000; // Rounds the number to to three decimals points
answer = Math.round(answer);
answer = answer/1000;
我也尝试过(如评论中所述),但它只显示相同的数字
double input = 1.0345;
Double.valueOf(new DecimalFormat("#.##").format(input)); // 2 decimal-places
System.out.println("1.0345 rounded is " + input);
但它似乎无法发挥作用。
答案 0 :(得分:1)
如果您处理精确值(特别是金额,利率......),您必须避免浮点值/算术。浮点变量可以采用非常大的值范围,但它们并不精确。特别是在计算长期或非常不同的数量时,您会遇到麻烦。舍入错误可能会累积。这是由十进制数的宽值范围以固定长度的32/64位二进制值存储的方式引起的。例如,无辜的友好值0.1
作为二进制浮点值非常困难。有关详细信息,请参阅IEEE 754规范。
因此,在这些情况下,您必须使用数据类型进行精确计算。 Java提供BigDecimal类。避免浮点精度错误的另一个方法是仅使用整数进行计算,然后格式化输出以使其具有一定数量的小数位。
但是,由于Java为定点数学(BigDecimal)提供了一个很好的即用型课程,你可以尝试一下。看看这个小例子代码片段。您可以从多个不同的rounding modes中进行选择,并确定您希望拥有的小数位数。
import java.math.BigDecimal;
import java.math.RoundingMode;
public class RoundTest {
public static void main(String[] args) {
String userInput = "42.133742";
BigDecimal startValue = new BigDecimal(userInput);
BigDecimal multFactor = new BigDecimal("1.23"); // => increase by 23 %
BigDecimal result = startValue.multiply(multFactor);
System.out.println("Original result without rounding: " + result);
System.out.println("Scale: " + result.scale());
// Compare different rounding modes:
final int DECIMAL_PLACES = 2;
BigDecimal roundDown = result.setScale(DECIMAL_PLACES, RoundingMode.DOWN);
BigDecimal roundHalfUp = result.setScale(DECIMAL_PLACES, RoundingMode.HALF_UP);
BigDecimal roundUp = result.setScale(DECIMAL_PLACES, RoundingMode.UP);
System.out.println("Round down (" + DECIMAL_PLACES + " decimal places): " + roundDown);
System.out.println("Round half-up (" + DECIMAL_PLACES + " dec. places): " + roundHalfUp);
System.out.println("Round up (" + DECIMAL_PLACES + " decimal places): " + roundUp);
}
}
答案 1 :(得分:0)
尝试这种方式:
answer = input * input;
BigDecimal bg = new BigDecimal(answer);
double rs = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
或
DecimalFormat df = new DecimalFormat("#.00");
double rs = df.format(answer);
使用BigDecimal将始终保持双值的pricise值。