Я попытался использовать это:
String t="4.99999999";
t = String.format("%.2f",Float.valueOf(t));
Я хотел, чтобы он печатал 4.99
, но написал 5.00
. Ты знаешь почему?
Здесь есть две проблемы. Один из них заключается в том, что float не может различать между 4.99999999
и 5.0
, то есть Float.valueOf()
анализирует его как 5.0
. У партией достаточно высокой точности. Другая проблема заключается в том, что 5.0 - правильное поведение для %2f
. Вы запрашиваете две десятичные точки, а 4.99999999 явно округляется до 5,00. Поскольку поведение String.format()
не то, что вы хотите, что вы хотите, то есть почему 4,99 правильное поведение для вашего случая использования?
Изменение: если вы пытаетесь усечь две две десятичные точки, посмотрите здесь: как я могу усечь двойное число до двух десятичных знаков в Java
В общем случае вы не должны использовать float (или double), когда думаете о десятичных числах.
Простой пример:
System.out.println(0.33333333333333333 + 0.1);
будет печатать:
0.43333333333333335
Java будет внутренне хранить поплавки и удваивать как "двоичные значения". И преобразование десятичных фракций в двоичные дроби вызовет много удивительных вещей.
Если вы хотите обрабатывать десятичные числа, вы должны использовать BigDecimal
или аналогичный класс.
Пример использования этого:
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
public class Snippet {
public static void main(String[] args) {
// define the value as a decimal number
BigDecimal value = new BigDecimal("4.99999999");
// round the decimal number to 2 digits after the decimal separator
// using the rounding mode, that just chops off any other decimal places
value.setScale(2, RoundingMode.DOWN);
// define a format, that numbers should be displayed like
DecimalFormat format = new DecimalFormat("#.00");
// use the format to transform the value into a string
String stringRepresentation = format.format(value);
// print string
System.out.println(stringRepresentation);
}
}
Если вы хотите, чтобы он показывал 4.99
почему вы не извлекаете подстроку
String t="4.99999999";
int i = t.indexOf('.');
if(i != -1){
t = t.substring(0, Math.min(i + 3, t.length()));
}
Если вы хотите, чтобы он всегда имел два десятичных знака, вы используете BigDecimal
. С BigDecimal
вы можете установить масштаб до 2 знаков после запятой и округлить так, чтобы числа, такие как 4
выходили из 4.00
String t="4";
BigDecimal bd = new BigDecimal(t).setScale(2, BigDecimal.ROUND_DOWN);
System.out.println(bd); //prints out 4.00
Пытаться
System.out.println(((int)(Float.valueOf(t) * 100))/100.0);