Целочисленное приведение в арифметических c выражениях в Kotlin - PullRequest
0 голосов
/ 07 февраля 2020

В следующем примере кода Kotlin я ожидал, что значение параметра i будет равно 0, как в случае с параметром k. В среде IDE все i, j и k отображаются как Int. Это ошибка или мне нужно скорректировать мое понимание Kotlin приведения внутри выражений? Например, есть ли правило всегда повышать / приводить к Double внутри выражений, включающих деление, но не умножение?

fun main() {
    //Kotlin 1.3.61
    val x = 100 * 1.0/100 //Double
    val i = 100 * 1/100 //Int
    val j = 1/100   //Int
    val k = 100 * j //Int
    println(x) //1.0
    println(i) //1
    println(j) //0
    println(k) //0
}

1 Ответ

0 голосов
/ 07 февраля 2020

Я ожидал, что значение параметра i будет равно 0

Арифметически правильный вывод: 100 * 1 / 100 = (100 * 1) / 100 = 100 / 100 = 1 / 1 = 1

, например, регистр для параметра k.

Значение j равно 0, поэтому все, умноженное на него, будет равно нулю, как в случае k.

есть ли правило всегда повышать / приводить к Double внутри выражений, включающих деление, но не умножение?

Если вы разделите целые числа, вы получите целое число обратно. Если одно из чисел двойное, результатом будет двойное:

 val x = 100 * 1.0/100 //Double because 1.0 is a Double

-

На форуме kotlin уже есть обсуждение вашей проблемы здесь :

Математически говоря, текущее поведение является правильным. Это называется целочисленным делением и приводит к частному как ответ

...