Я хотел написать парсер, который преобразует String в BigDecimal.Требуется, чтобы он был на 100% точным.(Ну, я сейчас программирую для удовольствия. Поэтому я скорее прошу об этом ... ;-P)
Итак, я придумал эту программу:
public static BigDecimal parse(String term) {
char[] termArray = term.toCharArray();
BigDecimal val = new BigDecimal(0D);
int decimal = 0;
for(char c:termArray) {
if(Character.isDigit(c)) {
if(decimal == 0) {
val = val.multiply(new BigDecimal(10D));
val = val.add(new BigDecimal(Character.getNumericValue(c)));
} else {
val = val.add(new BigDecimal(Character.getNumericValue(c) * Math.pow(10, -1D * decimal)));
decimal++;
}
}
if(c == '.') {
if(decimal != 0) {
throw new IllegalArgumentException("There mustn't be multiple points in this number: " + term);
} else {
decimal++;
}
}
}
return val;
}
Итак, я попытался:
parse("12.45").toString();
Я ожидал, что это будет 12.45
.Вместо этого это был 12.45000000000000002498001805406602215953171253204345703125
.Я знаю, что это может быть связано с ограничениями двоичного представления.Но как мне обойти это?
Примечание: я знаю, что вы можете просто использовать new BigInteger("12.45");
.Но это не моя точка зрения - я хочу написать это самостоятельно, независимо от того, насколько это глупо.