Десятичный формат с RoundingMode.HALF_UP - PullRequest
0 голосов
/ 12 декабря 2018

Имея простой код

import java.math.RoundingMode
import java.text.DecimalFormat

fun main(args: Array<String>) {
  val f = DecimalFormat("#.##").apply { roundingMode = RoundingMode.HALF_UP }
  println(f.format(-0.025f))
  println(f.format(-0.015f))
  println(f.format(-0.005f))
  println(f.format(0.005f))
  println(f.format(0.015f))
  println(f.format(0.025f))
}

Я получил следующий вывод:

-0,03 <- ок </p>

-0,01 <- ожидая -0,02 </p>

-0 <- ожидая -0,01 </p>

0 <- ожидая 0,01 </p>

0,01 <---ожидая 0,02 </p>

0,03 <- ок </p>

Правильно ли я понимаю RoundingMode.HALF_UP значение?

PS У меня былоВыяснилось, что использование двойников вместо чисел решает проблему.Так что println(f.format(0.005.toDouble())) работает, давая ожидаемое 0.1.

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Никогда не используйте float или double, если хотите, чтобы отображались точные цифры.Если вы округлите и хотите, чтобы округление происходило на твердой основе, вы не хотите, чтобы float или double ни; -)

Ваш образец, использующий double, также дал бы неправильные результаты.Ваш образец с использованием BigDecimal даст ожидаемые результаты.Итак ... придерживайтесь BigDecimal, если вы хотите быть в безопасности (r).

fun main(args: Array<String>) {
  val f = DecimalFormat("#.##").apply { roundingMode = RoundingMode.HALF_UP }
  println(f.format(BigDecimal("-0.025")))
  println(f.format(BigDecimal("-0.015")))
  println(f.format(BigDecimal("-0.005")))
  println(f.format(BigDecimal("0.005")))
  println(f.format(BigDecimal("0.015")))
  println(f.format(BigDecimal("0.025")))
}
0 голосов
/ 12 декабря 2018

Документация говорит о RoundingMode.HALF_UP:

Режим округления до «ближайшего соседа», если оба соседа не равноудалены, в этом случае округление вверх.

Хотя это может выглядеть как искомое поведение, это десятичные числа с плавающей запятой, и их трудно представить в памяти.На сайте Oracle .

import java.math.BigDecimal
import java.math.RoundingMode
import java.text.DecimalFormat

fun main(args: Array<String>) {
    val f = DecimalFormat("#.##").apply { roundingMode = RoundingMode.HALF_UP }
    println(f.format( BigDecimal("-1000.045")))
    println(f.format( BigDecimal("-1000.035")))
    println(f.format( BigDecimal("-1000.025")))
    println(f.format( BigDecimal("-1000.015")))
    println(f.format( BigDecimal("-1000.005")))
}
.

есть отличное прочтение. Итак, кажется, что -0,005 и -0,015 оба ближе (ближайший сосед) к -0,01, чем что-либо еще, поэтому они обаотформатированы как -0.01.Чтобы заставить ваш код делать то, что вы хотите, это изменить режим округления на:

roundingMode = RoundingMode.UP

Результат выполнения:

-0.03
-0.02
-0.01
0.01
0.02
0.03

Это именно то, что выожидается.Если вы хотите, чтобы ваш код работал, вы можете использовать следующий подход:

*1019*
...