相关疑难解决方法(0)

如何在Java中将数字舍入到n个小数位

我想要的是一种将double转换为使用half-up方法进行舍入的字符串的方法 - 即如果要舍入的小数为5,则它总是向上舍入到前一个数字.这是在大多数情况下舍入大多数人所期望的标准方法.

我也希望只显示有效数字 - 即不应该有任何尾随零.

我知道这样做的一种方法是使用该String.format方法:

String.format("%.5g%n", 0.912385);
Run Code Online (Sandbox Code Playgroud)

收益:

0.91239
Run Code Online (Sandbox Code Playgroud)

这很好,但它总是显示5位小数的数字,即使它们不重要:

String.format("%.5g%n", 0.912300);
Run Code Online (Sandbox Code Playgroud)

收益:

0.91230
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用DecimalFormatter:

DecimalFormat df = new DecimalFormat("#.#####");
df.format(0.912385);
Run Code Online (Sandbox Code Playgroud)

收益:

0.91238
Run Code Online (Sandbox Code Playgroud)

但是你可以看到这使用了半均匀舍入.也就是说,如果前一个数字是偶数,它将向下舍入.我想要的是这个:

0.912385 -> 0.91239
0.912300 -> 0.9123
Run Code Online (Sandbox Code Playgroud)

在Java中实现这一目标的最佳方法是什么?

java decimal rounding digits

1209
推荐指数
22
解决办法
155万
查看次数

舍入小数点

可能重复:
将小数点后的双精度数加到2位有效数字

我正在尝试将十进制度(23.1248)转换为分钟样式度(23 7'29.3").这是我到目前为止所做的:

   double a=23.1248;
   int deg=(int)a;//gives me the degree
   float b=(float) (a-deg);
   int min=(int) (b*60);//gives me the minutes
   double sec= (double) ((c*60)-min);//gives me my seconds
Run Code Online (Sandbox Code Playgroud)

一切正常,但我希望将秒数舍入到最接近的十分之一或十分之一.我已经查看了十进制格式,但不希望将其转换为字符串.我也看过bigdecimal,但不认为这会有所帮助,

java decimal-point

6
推荐指数
1
解决办法
5万
查看次数

BigDecimal错误

在Java中,我将k定义为 double k=0.0;

我从数据库中获取数据并添加相同的使用while循环,

while(rst.next()) {
k = k + Double.parseDouble(rst.getString(5));
}
Run Code Online (Sandbox Code Playgroud)

NOTE: In database, I have values as 125.23, 458.45, 665.99 (all two decimals)

当我显示k时,我得到的价值为

k = 6034.299999999992

因此我介绍BigDecimal并将代码更改为以下内容

      BigDecimal bd = new BigDecimal(k);
      bd = bd.setScale(2,BigDecimal.ROUND_UP);
Run Code Online (Sandbox Code Playgroud)

现在我得到新的总数bd=6034.30是正确的.

问题1

好吧问题是当我在其他地方使用相同的时候,下面是我得到的

 k  = 157.3
 bd = 157.31
Run Code Online (Sandbox Code Playgroud)

它应该显示bd=157.30为手动添加后我得到157.30.

任何原因显示为157.31.

问题2

还有什么原因k显示这么多的十进制值?下面是我得到的双变量k的不同值

157.3
67.09
1014.6000000000003
229.06999999999996
Run Code Online (Sandbox Code Playgroud)

我不明白它有时会显示一个小数,有时显示2位小数,大部分时间显示14位小数.

任何建议将不胜感激.

java floating-point double bigdecimal

5
推荐指数
2
解决办法
3430
查看次数

BigDecimal.valueOf(float) 如何工作?

我已经看过这个答案了

的行为让我有点困惑BigDecimal.valueOf(float)。这是示例:

System.out.println(BigDecimal.valueOf(20.2f)); //prints 20.200000762939453
Run Code Online (Sandbox Code Playgroud)

所以

float f = BigDecimal.valueOf(20.2f)
            .setScale(2, RoundingMode.UP)
            .floatValue();
System.out.println(f); //prints 20.21
Run Code Online (Sandbox Code Playgroud)

这绝对不是我预期的行为。有没有办法round up正确浮动避免此类错误?

java floating-point

2
推荐指数
1
解决办法
557
查看次数

在java中格式化float变量,最多2位数

我试图显示浮点变量高达两位数的精度.假设变量是50.35,那么它就会显示出来.但是当变量为50.30时,它只显示50.3.无法显示50.30.

java

0
推荐指数
1
解决办法
1859
查看次数