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 / 10jest 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ż 3i 10są stałymi liczbami całkowitymi bez typu, wartość wyrażenia jest liczbą całkowitą bez typu ( 0w 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 float64stałą 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