如何判断结果是否为十进制?

时间:2016-05-21 05:04:12

标签: java jsp

我有两个浮点数,它们可以是小数,也可以不是小数,具体取决于我想用十进制或不带小数打印结果的操作。

我在不需要时使用String.format取消小数。但是,我很难确定结果何时为十进制。尝试了n1%n2>来自类似问题的0方法,但是当输入例如6 + 7时,结果变为13.0而不是13。

到目前为止

代码:

    float n1 = Float.parseFloat(request.getParameter("num1").toString().trim());
    float n2 = Float.parseFloat(request.getParameter("num2").toString().trim());

    String res = String.valueOf(n1+n2);

    if(n1 % n2 > 0)
        {
           out.println("It's decimal");
           out.println(n1+n2);
        }else{
           out.println(String.format("%.0f", n1+n2));
        }

4 个答案:

答案 0 :(得分:0)

您可以使用Math.round来判断float是否为整数。 (如果您的唯一目的是在格式化为字符串时抑制整数的小数点,还有其他方法 - 请参阅KevinO的评论。)

如果f是浮点数,Math.round(f)会返回intf四舍五入到最接近的整数,除非f超出范围int。但是,如果f超出int的范围,那么f必须是整数,出于所有实际目的 - 如果f足够大以至于它也是大到适合int,那么它太大了,无法区分小于1.0的值(float中的精度比int中的精度更低})。因此,f无法表示该数量级的非整数。

考虑到这一点,假设f不是+/-无穷大,你可以测试f是否是这样的整数:

public boolean isInteger(float f) {
    return f > (float)Integer.MAX_VALUE ||
           f < (float)Integer.MIN_VALUE ||
           f == (float)Math.round(f);
}

但请注意,即使非整数在格式化时也可能显示为某些内容 .000000,因为格式化程序必须将f舍入到一定数量的打印时的小数位。这取决于您使用的格式。

注意:如果float是您拥有的唯一信息,则上述方法是确定浮点数是否为整数的正确方法。但是,在更大的计划的背景下,还有其他考虑因素。如果参数字符串为"2000000000.1",当您将其解析为float时,您将获得2000000000,这是一个整数,因为float没有足够的精度来表示.1。此时,您的float将是一个整数值,而且它知道.1已经太晚了 - 该信息已经丢失。如果您不想丢失该信息,请不要使用floatdouble - 请改用BigDecimal

答案 1 :(得分:0)

要在Java中使用非整数(带分数的数字)进行精确数学运算,您应该使用BigDecimal。该类允许精确表示任意精度的非整数。

那是你的代码应改为:

final BigDecimal n1 = new BigDecimal(request.getParameter("num1").toString().trim());
final BigDecimal n2 = new BigDecimal(request.getParameter("num2").toString().trim());

final BigDecimal res = n1.add(n2);
final BigDecimal remainder = n1.remainder(n2);

//if (res.stripTrailingZeros().scale() > 0) {
if (remainder.compareTo(BigDecimal.ZERO) != 0) {
    System.out.println("It's decimal");
    System.out.println(res);
} else {
    final DecimalFormat df = new DecimalFormat("#.0f");
    System.out.println(df.format(res));
}

如果用户输入的数字大于Integer.MAX_VALUE或低于Integer.MIN_VALUE,则其他答案不会为您提供正确的结果。转换为long可能会产生错误的结果,因为float的精度可能导致结果具有小数部分,即使输入数字没有...

但是,我希望您对请求数据进行一些输入验证。否则,您很可能会从JSP页面获得大量NumberFormatExceptions

<强>更新 更新了代码示例以检查比例而不是精度。

答案 2 :(得分:0)

转换为int然后返回:

boolean isDecimal = myFloat != (float)(int)myFloat;

转换为int截断小数部分。

或者,您可以使用字符串方法。点后面的小数位数非零,所以:

boolean isDecimal = String.valueOf(myFloat).matches(".*\\.(?=.*[1-9]).*");

答案 3 :(得分:0)

如果您只需要输出,最简单的方法可能就是使用字符串操作:

String s = String.format("%.4f", n1 + n2);  // use whatever decimal places you like
s = s.replaceFirst("\\.0*$", "");
System.out.println(s);

如果您的Locale中的小数点分隔符是,而不是。,则会失败。所以要小心。

要真正检查双值x是否为完整,您可以使用此测试:

if (x % 1 == 0) {
    // integral
} else {
    // not integral
}