2015-12-10 3 views
0

У меня есть 3 значения BigDecimal, и я хочу, чтобы найти 3 значения, которые представляют его отношение к их сумме и эти отношения должны добавить до 1. Тем не менее, я бегу в следующее сообщение об ошибке:Как рассчитать отношения значений к их сумме?

BigDecimal a = new BigDecimal("19000.0000"); 
BigDecimal b = new BigDecimal("31000.0000"); 
BigDecimal c = new BigDecimal("999901467.88"); 

BigDecimal sum = a.add(b).add(c); //999951467.8800 

BigDecimal aRatio = a.divide(sum, 4, BigDecimal.ROUND_HALF_UP); //returns 0.0000 
BigDecimal bRatio = b.divide(sum, 4, BigDecimal.ROUND_HALF_UP); //returns 0.0000 
BigDecimal cRatio = c.divide(sum, 4, BigDecimal.ROUND_HALF_UP); //returns 0.9999 

/** returns 0.9999 doesn't equal to 1! **/ 
BigDecimal totalRatio = aRatio.add(bRatio).add(cRatio); 

Как вам может видеть сумму 3 отношений не составляет до 1. Я могу изменить масштаб от 4 до 5, и это решит проблему. Однако Я использую тот же код, что и для вычисления других разных чисел. Поэтому я пытаюсь найти правильный подход, который будет работать для любых отношений X с любыми цифрами.

+0

Я считаю, что осталось после десятичной ROUND_HALF_UP первого соотношения следует добавить к следующему соотношению перед тем ROUND_HALF_UP следующего соотношения. Таким образом, в bRatio перед добавлением ROUND_HALF_UP – achin

ответ

4

Как только вы используете округление, вы фактически согласитесь, что результаты не совсем верны. Таким образом, если цель состоит в том, чтобы сумма коэффициентов равна 1, просто сделать

BigDecimal aRatio = a.divide(sum, 4, BigDecimal.ROUND_HALF_UP); 
BigDecimal bRatio = b.divide(sum, 4, BigDecimal.ROUND_HALF_UP); 
BigDecimal cRatio = BigDecimal.ONE.subtract(aRatio.add(bRatio)); 
+0

следует добавить оставшееся соотношение (т. Е. ARatio - ROUNDED_UP_ARatio). Используете ли вы такой же подход для числа X-коэффициентов? – Glide

+0

Я не использую этот подход. Вы хотите использовать его. Но если это то, что вы хотите, тогда идите. –

+0

Плохая формулировка - но будет ли такой подход работать для коэффициентов X любого числа? Что, если последнее число равно 0, то выполнение BigDecimal.ONE.subtract() в последнем соотношении не будет работать, правильно? – Glide

 Смежные вопросы

  • Нет связанных вопросов^_^