Java 8 здесь. Согласно Google:
- Преобразование фунтов в килограммы: умножить на 0,453592
- Преобразование килограммов в фунты: умножить на 2,20462
- Преобразование дюймов в метры: умножить на 0,0254
- Преобразование метров в дюймы: умножить на 39,3701
Итак, я создал этот небольшой Java-код:
public class MeasurementConverter {
private static final int SCALE = 2;
public static void main(String[] args) {
new MeasurementConverter().run();
}
private void run() {
BigDecimal hundredLbs = new BigDecimal(100.00);
BigDecimal hundredInches = new BigDecimal(100.00);
System.out.println(hundredLbs + " pounds is " + poundsToKilos(hundredLbs) + " kilos and converts back to " + kilosToPounds(poundsToKilos(hundredLbs)) + " pounds.");
System.out.println(hundredInches + " inches is " + inchesToMeters(hundredInches) + " meters and converts back to " + metersToInches(inchesToMeters(hundredInches)) + " inches.");
}
private BigDecimal metersToInches(BigDecimal meters) {
return meters.multiply(new BigDecimal("39.3701").setScale(SCALE, BigDecimal.ROUND_HALF_UP));
}
private BigDecimal inchesToMeters(BigDecimal inches) {
return inches.multiply(new BigDecimal("0.0254").setScale(SCALE, BigDecimal.ROUND_HALF_UP));
}
private BigDecimal kilosToPounds(BigDecimal kilos) {
return kilos.multiply(new BigDecimal("2.20462").setScale(SCALE, BigDecimal.ROUND_HALF_UP));
}
private BigDecimal poundsToKilos(BigDecimal pounds) {
return pounds.multiply(new BigDecimal("0.45359").setScale(SCALE, BigDecimal.ROUND_HALF_UP));
}
}
Когда он запускается, он распечатывает:
100 pounds is 45.00 kilos and converts back to 99.0000 pounds.
100 inches is 3.00 meters and converts back to 118.1100 inches.
В то время как я ожидал его распечатать:
100.00 pounds is 45.00 kilos and converts back to 100.00 pounds.
100.00 inches is 3.00 meters and converts back to 100.00 inches.
Все, что меня волнует, это то, что преобразование в имперские ‹-> метрические единицы выполняется с точностью до 2 знаков после запятой, а конечные результаты всегда точны до 2 знаков после запятой. Может ли кто-нибудь увидеть, в чем я ошибаюсь и в чем заключается исправление?
double
вnew BigDecimal
теряет точность, потому что вы используете не точное значение, а скорее ближайшее представимое значение как двойное. Вместо этого используйтеnew BigDecimal("39.37")
и т. Д. Также помните, что эти обратные величины не точны, поэтому 39,37 * 0,0254 = 0,999998, а не 1. - person Andy Turner   schedule 19.02.2018