如何将Java取整为零?
因此-1.9变为-1.0,-0.2变为0.0,3.4变为3.0,依此类推。
Math.round()能够更改某些参数吗?
x-x%1(仅在Java中)
我不认为标准库具有这样的功能。
问题是,您要问的是非常不同的行为(从数学上来说),具体取决于数字是大于还是小于0(即四舍五入为负值,四舍五入为正值)
可以使用以下方法:
public double myRound(double val) {
if (val < 0) {
return Math.ceil(val);
}
return Math.floor(val);
}
+1:到目前为止,唯一做正确的事情的答案(AFAICS)。
像这样长时间投放:
float x= 1.9;
long y = (long)x;
这会将正数和负数都舍入为零。
如果结果适合int,则如果int
为什么要转换为int并将其存储在long中?强制转换为long。
+1:long y = (long) x;可能比使用(int)更好
-1:如果浮点数太大或太小而无法用64位整数表示,则此操作将失败。无论是int还是long,问题都只会转移。这样的数字在日常使用中可能并不常见-但这只会使查找与上溢/下溢相关的错误更加困难。
使用RoundingMode.DOWN,它趋于零。
范例:
BigDecimal value = new BigDecimal("1.4");
value = value.setScale(0, RoundingMode.DOWN);
System.out.println(value.doubleValue());
BigDecimal value1 = new BigDecimal("-1.4");
value1 = value1.setScale(0, RoundingMode.DOWN);
System.out.println(value1.doubleValue());
BigDecimal可以代表float或double可以代表的所有值吗?
BigDecimal是用Java表示数字的方式,因此使用BigDecimal有意义
@Oli是的。 BigDecimal是任意精度的十进制数,它可以表示float和double can等所有值。
@mprabhat BigDecimal不是用Java表示数字的方式。它是其中之一。
当然,这太过分了,特别是当一个原始函数就可以了。
只是将其转换为int会为您做到这一点?
编辑:如果您想保留一个双,这应该足够简单地工作:
if (val < 0)
return -Math.floor(-val);
else
return Math.floor(val);
而对于只想要分支免费代码并觉得更聪明的人来说:
long tmp = Double.doubleToLongBits(val);
tmp >>>= 63;
return Math.floor(val) + tmp;
如果结果适合int,如果int可能很大。
@aix足够正确,但是您也不能保证存在一个可以代表数字的双精度型。但是,那是我的挑剔;)
y=sign(x)*floor(abs(x))
要么
y=sign(x)*round(abs(x)-0.5)
它应该易于用Java实现。
您也可以尝试以下操作:
public static void main(String[] args) {
Double myDouble = -3.2;
System.out.println(myDouble.intValue()); //Prints -3
}
BigDecimal提供许多舍入选项。
尤其是,解决OP需求将是" DOWN",这与FLOOR不同,因为FLOOR遵循正确的数学行为。
好像您想始终向下舍入?您可以改用Math.floor
public static double floor(double a)
Returns the largest (closest to positive infinity) double value that
is not greater than the argument and is equal to a mathematical
integer. Special cases:
Math.floor()取整为-ve无穷大,而不是零。