我有两个浮点数,它们可以是小数,也可以不是小数,具体取决于我想用十进制或不带小数打印结果的操作。
我在不需要时使用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));
}
答案 0 :(得分:0)
您可以使用Math.round
来判断float
是否为整数。 (如果您的唯一目的是在格式化为字符串时抑制整数的小数点,还有其他方法 - 请参阅KevinO的评论。)
如果f
是浮点数,Math.round(f)
会返回int
,f
四舍五入到最接近的整数,除非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
已经太晚了 - 该信息已经丢失。如果您不想丢失该信息,请不要使用float
或double
- 请改用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
}