round up to 2 decimal places in java?
我读过很多StackOverflow问题,但似乎没有一个适合我。我用math.round()四舍五入。这是代码:
1 2 3 4 5 6 7 8 9
| class round {
public static void main (String args []){
double a = 123.13698;
double roundOff = Math. round(a *100)/100;
System. out. println(roundOff );
}
} |
我得到的输出是:123,但我希望它是123.14。我读到添加*100/100会有所帮助,但正如你所看到的,我没有设法让它工作。
输入和输出都必须是双精度的。
如果您更改上面代码的第4行并发布它,这将是非常好的帮助。
- 使用上面使用的*100/100技术,我相信您希望截短,而不是取整。Math.floor(a*100) / 100d)想想数学在做什么:123.1299*100=12312.99。floor()=12312.0则/100=123.12
- stackoverflow.com/a/10959430/621951是最好的解决方案。它可以工作。
- 试一试数学。四舍五入(A*100)/100d;
好吧,这一个有效…
1
| double roundOff = Math. round(a * 100.0) / 100.0; |
输出是
或者如鲁芬所说
1
| double roundOff = (double) Math. round(a * 100) / 100; |
这对你也有好处。
- 这可以调整到小数点后3或5位吗?
- 它也适用于double roundOff = (double) Math.round(a * 100) / 100;。
- +1或double roundOff = Math.round(a * 100) / 100.0;。
- @sib floor(x+0.5)与round(x)不同,仅对于一个值,该值立即小于0.5。这是因为0.49999999999999994 + 0.5是1.0,应该向下取整到0.0。
- -1乘以100不适用于太大的数字,因为它们将超出范围并从下限开始。@amitchhajer回答正确
- @马丁·阿塞诺夫,你说得对。但是,Java中的加倍的范围是2 ^ 1074=x<=(2-2^ - 52)和α183;2 ^ 1023 / /其中x是加倍。你不认为如果你的数字超出了双打的范围,那么整个方法需要重新审视吗?
- 嗯,是的,因为它实际上发生在我身上:)
- 仍然想知道为什么没有人提到新的bigdecimal(123.13698).round(new mathcontext(5)).doubleValue()。
- @sib double roundoff=math.round(a*100.0)/100.0可以。但是,双Roundoff=math.round(a*1.0)/1.0不起作用。为什么呢?
- 有些值返回零,不知道为什么!!
- @Muhammad Gelbana-零的数目增加了位置。例如:(1000.0)/1000.0,三位小数四舍五入。
- (数学四舍五入(395.0349999999*100)/100.0。)将变为395.03。我知道为什么as 395034是最近的长,然后除以100。不过,我认为一般人都希望结果是395.04。
- 它能用,但看起来很难看!我希望有像round(double, int=0)这样的东西可以达到这个目的,它的可读性会更高…
- @如果人们期望结果是395.04,那么他们就是错的。395.0349999999接近395.03,因此395.03是正确答案。
- 埃多克斯1〔10〕怎么样
- 上面写着DecimalFormat cannot be resolved to a type。
- 是否导入java.text.deciMalfat;?
- 这有帮助吗?
- 只有当双精度数不小于1且大于-1时,该方法才有效-当这种情况发生时,它不会显示0。
- double doubleValue=245;decimalformat df=new decimalformat("35;.00");system.out.println("value:"+float.valueof(df.format(doubleValue));打印245.0而不是245.00
- 十进制格式不舍入其任何函数的最后一个十进制值。所有函数的舍入边距都大于5,但应该大于4。例如-1.235应该四舍五入为1.24,但df格式将其四舍五入为1.23,这是错误的。但数学圆是准确的。
- 不可能不起作用。问题是为了取整价值。不仅是格式。无论如何,如果您想使用decimalMatter,那么您必须将roundingMode设置为up或down。decimalMatter.setRoundingMode(roundingMode.up);decimalMatter.setRoundingMode(roundingMode.down);
- 但是如果你以后想用这个号码怎么办?再分析一遍?那不是可行的选择
1 2 3 4
| String roundOffTo2DecPlaces (float val )
{
return String. format("%.2f", val );
} |
- @你说用上面的方法不会得到一致的结果吗?
- 是的,Arun。使用string.format,我可以像我的国家使用的那样设置税收小数点的格式。
回到你的代码,用100.00替换100,让我知道它是否有效。但是,如果您想要正式,请尝试以下操作:
尝试:
1 2 3 4 5 6 7
| class round {
public static void main (String args []){
double a = 123.13698;
double roundOff = Math. round(a *100)/100;
String. format("%.3f", roundOff ); //%.3f defines decimal precision you want
System. out. println(roundOff ); }} |
我知道这是一个2年前的问题,但由于每个人都面临着在某个时间点取整数值的问题,我想分享一种不同的方法,通过使用BigDecimal类,我们可以将数值取整到任何比例。在这里,我们可以避免额外的步骤,如果我们使用DecimalFormat("0.00")或使用Math.round(a * 100) / 100就需要额外的步骤来获得最终值。③
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| import java.math.BigDecimal;
public class RoundingNumbers {
public static void main (String args []){
double number = 123.13698;
int decimalsToConsider = 2;
BigDecimal bigDecimal = new BigDecimal(number );
BigDecimal roundedWithScale = bigDecimal. setScale(2, BigDecimal. ROUND_HALF_UP);
System. out. println("Rounded value with setting scale ="+roundedWithScale );
bigDecimal = new BigDecimal(number );
BigDecimal roundedValueWithDivideLogic = bigDecimal. divide(BigDecimal. ONE,decimalsToConsider, BigDecimal. ROUND_HALF_UP);
System. out. println("Rounded value with Dividing by one ="+roundedValueWithDivideLogic );
}
} |
这个程序会给我们下面的输出
1 2
| Rounded value with setting scale = 123.14
Rounded value with Dividing by one = 123.14 |
- 您也可以使用BigDecimal.ROUND_HALF_EVEN来实现类似于Math.round()的逻辑(1.204=1.20,1.205=1.21)。
1
| double roundOff = Math. round(a *100)/100; |
应该是
1
| double roundOff = Math. round(a *100)/100D ; |
将"d"添加到100使其为双文本,因此生成的结果将具有精度
- 不起作用,结果仍然是123.0
- 我现在把"f"改成分母了。现在应该可以了
- 输出更是一团糟。123.13999938964844
这是一个很长的问题,但却是一个全面的解决方案,永远不会失败。
只需将您的数字作为一个双精度数传递给此函数,它将返回您将十进制值四舍五入到最接近的值5;
如果4.25,输出4.25
如果4.20,输出4.20
如果4.24,输出4.20
如果4.26,输出4.30
如果要四舍五入到小数点后两位,则使用
如果最多3个位置,则新的decimalFormat("35;")。
如果最多N个位置,则新的decimalFormat(".ntimes")。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| public double roundToMultipleOfFive (double x )
{
x =input. nextDouble();
String str =String. valueOf(x );
int pos =0;
for(int i =0;i <str. length();i ++)
{
if(str. charAt(i )=='.')
{
pos =i ;
break;
}
}
int after =Integer. parseInt(str. substring(pos +1,str. length()));
int Q =after /5;
int R =after %5 ;
if((Q %2 )==0)
{
after =after -R ;
}
else
{
if(5-R ==5)
{
after =after ;
}
else after =after +(5-R );
}
return Double. parseDouble(str. substring(0,pos +1). concat(String. valueOf(after ))));
} |
似乎你被整数算术击中了:在某些语言中(int)/(int)总是被计算为整数算术。为了强制执行浮点运算,请确保至少有一个操作数是非整数:
1
| double roundOff = Math. round(a *100)/100. f; |
- 使用double roundOff = Math.round(a*100F)/100.f;时,输出更加混乱。是:123.13999938964844。
- 您有兴趣打印整数还是评估整数(用它做些什么)?如果只是打印,您应该查找println的文档。如果你对这些数字感兴趣,那么我猜(实际上还没有确认)"混乱"的输出实际上是正确的,因为它是相当于"123.14"的关闭浮点(检查这个)。
我刚修改了你的代码。它在我的系统中工作正常。看看这是否有帮助
1 2 3 4 5 6 7 8 9
| class round {
public static void main (String args []){
double a = 123.13698;
double roundOff = Math. round(a *100)/100.00;
System. out. println(roundOff );
}
} |
1 2 3
| public static float roundFloat(float in) {
return ((int)((in*100f)+0.5f))/100f;
} |
在大多数情况下应该是正常的。例如,如果希望与double兼容,您仍然可以更改类型。