Próbuję dokonać prostego podziału w Go.
fmt.Println(3/10)
Wypisuje 0 zamiast 0,3. To trochę dziwne. Czy mógłby ktoś powiedzieć, jaki jest tego powód? chcę wykonywać różne operacje arytmetyczne w Go.
Dzięki
Próbuję dokonać prostego podziału w Go.
fmt.Println(3/10)
Wypisuje 0 zamiast 0,3. To trochę dziwne. Czy mógłby ktoś powiedzieć, jaki jest tego powód? chcę wykonywać różne operacje arytmetyczne w Go.
Dzięki
Odpowiedzi:
Wyrażenie 3 / 10
jest nietypowym wyrażeniem stałym. Specyfikacja mówi to o stałych wyrażeniach
jeśli operandy operacji binarnej są różnymi rodzajami nietypowych stałych, operacja i, w przypadku operacji innych niż boolowskie, wynik będzie taki, jaki pojawia się później na tej liście: liczba całkowita, runa, zmiennoprzecinkowa, zespolona.
Ponieważ 3
i 10
są stałymi liczbami całkowitymi bez typu, wartość wyrażenia jest liczbą całkowitą bez typu ( 0
w tym przypadku).
Jeden z operandów musi być stałą zmiennoprzecinkową, aby wynik był stałą zmiennoprzecinkową. Następujące wyrażenia są obliczane na nietypową stałą zmiennoprzecinkową 0.3
:
3.0 / 10.0
3.0 / 10
3 / 10.0
Możliwe jest również użycie stałych wpisanych. Następujące wyrażenia są obliczane na float64
stałą 0.3
:
float64(3) / float64(10)
float64(3) / 10
3 / float64(10)
Wydrukowanie dowolnego z powyższych wyrażeń zostanie wydrukowane 0.3
. Na przykład fmt.Println(3.0 / 10)
wydruki 0.3
.
fmt.Println(float64(3) / float64(10))
daje 0.3
.
Jak wspomniano w @Cerise i zgodnie ze specyfikacją
Operatory arytmetyczne mają zastosowanie do wartości liczbowych i dają wynik tego samego typu, co pierwszy operand.
W tym przypadku tylko pierwszy operand musi być zmiennoprzecinkowym.
fmt.Println(3.0/10)
fmt.Println(float64(3)/10)
// 0.3 0.3