BG Development


  Reply to this topicStart new topicStart Poll

> Закръглявания с DecimalFormat
Pascal
Публикувано на: 07-08-2018, 20:31
Quote Post



Име:
Група: Потребител
Ранг: Старо куче

Мнения: 690
Регистриран на: 22.11.06



Когато се закръглява с DecimalFormat до цяло число ("###"), режим java.math.RoundingMode.HALF_UP работи интуитивно, т.е. 41.5 закръгклява до 42; 42.5 закръглява до 43. По default DecimalFormat закръгкявам в режим HALF_EVEN, което закръглява както 41.5 така и 42.5 към 42 (най-близкото четно число). Това само по себе си е голяма глупост според мен, но това е друга тема.

Моят проблем е, че закръгляването след десетичната точка е малко непредсказуемо. Ето нагледен пример:

CODE
import java.text.DecimalFormat;

public class TestRoundSix
{
   final static DecimalFormat sixDigitsFormat =
           new DecimalFormat("###.######");
   final static DecimalFormat halfUpFormat;
   static {
       halfUpFormat = new DecimalFormat("###.######");
       halfUpFormat.setRoundingMode(java.math.RoundingMode.HALF_UP);
   }

   final static double[] doubles = {
       43.4212115,
       43.4212125,
       42.4212115,
       42.4212125
   };

   static String roundSix(double value)
   {
       return sixDigitsFormat.format(
               Math.round(value * 1000000.0) / 1000000.0);
   }

   public static void main(String[] args) throws Exception
   {
       for (Double d: doubles) {
           System.out.println("Java/Half Up/Math format for (" + d +
                   ") = (" + sixDigitsFormat.format(d)
                   + "/" + halfUpFormat.format(d) + "/" + roundSix(d) + ")");
       }
   }
}

Резултат:

Java/Half Up/Math format for (43.4212115) = (43.421211/43.421211/43.421212)
Java/Half Up/Math format for (43.4212125) = (43.421213/43.421213/43.421213)
Java/Half Up/Math format for (42.4212115) = (42.421211/42.421211/42.421212)
Java/Half Up/Math format for (42.4212125) = (42.421213/42.421213/42.421213)


На базата на горните тестове, режимът на закръгляване не оказва никакво влияние на закръгляване след десетичната точка.

Има ли начин закръгляването след десетичната точка с DecimalFormat.format да работи подобно на метода sixRound от горния пример?

PMEmail Poster
Top
thrawn
Публикувано на: 08-08-2018, 04:40
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1727
Регистриран на: 17.01.17



Какво се опитваш да постигнеш всъщност?
Числата с плаваща запетая не са точни и ако става дума за сметки то те мога да те прецакат сериозно (особено ако става дума за пари).

Затова, когато гониш точност не ползвай double и производните му а BigDecimal. Така ще можеш да фиксираш точността и закръгляването няма да ти върти номера.
PMEmail Poster
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2018 | BG Development | All Rights Reserved
RSS 2.0