英文:
Rounding off double to closest (minimum) value
问题
我有一个方法,有时会返回0.28 / 0.23。
我正在使用下面的类
DecimalFormat df2 = new DecimalFormat("#.#");
但是这里我希望这段代码每次都返回0.2,但当它大于0.25时,会将其四舍五入为最接近的小数0.3。
但我希望我的代码在值在0.21到0.29之间变化时每次都返回0.2。有人可以帮助我吗?
英文:
I have a method which sometimes returns 0.28 / 0.23 .
I am using the below class
DecimalFormat df2 = new DecimalFormat("#.#");
but here I need this code to return me 0.2 every-time , but when its more than 0.25 its returns 0.3 by rounding it off to closet decimal .
But i want my code to return 0.2 every-time the value varies from 0.21 to 0.29.
can someone help me with this ?
答案1
得分: 4
你可以将 RoundingMode
设置为向下舍入。
df2.setRoundingMode(RoundingMode.DOWN);
答案2
得分: 0
以下是翻译好的部分:
double[] data = {
.21, .22, .22, .23, .24, .25, .26, .27, .28, .29
};
for (double value : data) {
System.out.println(value + " -> " + ((int) (value * 10)) / 10d);
}
输出结果:
0.21 -> 0.2
0.22 -> 0.2
0.22 -> 0.2
0.23 -> 0.2
0.24 -> 0.2
0.25 -> 0.2
0.26 -> 0.2
0.27 -> 0.2
0.28 -> 0.2
0.29 -> 0.2
英文:
You can also do it as follows without using DecimalFormat
. To round down to the nearest 10th
, just multiple by 10
, casting as an int
and then divide by 10d
.
double[] data = {
.21,.22,.22,.23,.24,.25,.26,.27,.28,.29
};
for (double value : data) {
System.out.println(value + " -> " + ((int) (value * 10)) / 10d);
}
prints
0.21 -> 0.2
0.22 -> 0.2
0.22 -> 0.2
0.23 -> 0.2
0.24 -> 0.2
0.25 -> 0.2
0.26 -> 0.2
0.27 -> 0.2
0.28 -> 0.2
0.29 -> 0.2
</details>
# 答案3
**得分**: 0
以下是您要翻译的内容:
There are a few ways to accomplish this.
Casting a floating-point value to an integer will truncate the decimal.
So, you could utilize this by first multiplying by 10, truncating the value, and then re-dividing by 10.
```java
float valueA = 0.28f;
float valueB = 0.23f;
valueA = ((int) (valueA * 10)) / 10f;
valueB = ((int) (valueB * 10)) / 10f;
Output
valueA = 0.2
valueB = 0.2
Additionally, you can utilize the BigDecimal class.
The setScale method allows you to set the amount of digits after the decimal point, in addition to setting a RoundingMode.
There are numerous types of rounding modes, see the RoundingMode JavaDoc linked above, for a table of values.
I believe you are looking for FLOOR, or DOWN, for the truncation.
Here is an example using DOWN.
BigDecimal valueA = new BigDecimal("0.28");
BigDecimal valueB = new BigDecimal("0.23");
valueA = valueA.setScale(1, RoundingMode.DOWN);
valueB = valueB.setScale(1, RoundingMode.DOWN);
Output
valueA = 0.2
valueB = 0.2
On a final note, you could just parse the value as a String and substring the value for 1 digit after the decimal point.
float valueA = 0.28f;
float valueB = 0.23f;
String stringA = String.valueOf(valueA);
valueA = Float.parseFloat(stringA.substring(0, stringA.indexOf('.') + 2));
String stringB = String.valueOf(valueB);
valueB = Float.parseFloat(stringB.substring(0, stringB.indexOf('.') + 2));
Output
valueA = 0.2
valueB = 0.2
英文:
There are a few ways to accomplish this.
Casting a floating-point value to an integer will truncate the decimal.
So, you could utilize this by first multiplying by 10, truncating the value, and then re-dividing by 10.
float valueA = 0.28f;
float valueB = 0.23f;
valueA = ((int) (valueA * 10)) / 10f;
valueB = ((int) (valueB * 10)) / 10f;
Output
valueA = 0.2
valueB = 0.2
Additionally, you can utilize the BigDecimal class.
The setScale method allows you to set the amount of digits after the decimal point, in addition to setting a RoundingMode.
There are numerous types of rounding modes, see the RoundingMode JavaDoc linked above, for a table of values.
I believe you are looking for FLOOR, or DOWN, for the truncation.
Here is an example using DOWN.
BigDecimal valueA = new BigDecimal("0.28");
BigDecimal valueB = new BigDecimal("0.23");
valueA = valueA.setScale(1, RoundingMode.DOWN);
valueB = valueB.setScale(1, RoundingMode.DOWN);
Output
valueA = 0.2
valueB = 0.2
On a final note, you could just parse the value as a String and substring the value for 1 digit after the decimal point.
float valueA = 0.28f;
float valueB = 0.23f;
String stringA = String.valueOf(valueA);
valueA = Float.parseFloat(stringA.substring(0, stringA.indexOf('.') + 2));
String stringB = String.valueOf(valueB);
valueB = Float.parseFloat(stringB.substring(0, stringB.indexOf('.') + 2));
Output
valueA = 0.2
valueB = 0.2
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论