Jak przeprowadzić podział w Go

88

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

Vrushank Doshi
źródło

Odpowiedzi:

89

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.

Top Muffin
źródło
Przyjmuję dane wejściowe, zakładając, że są to wartości procentowe. Na przykład jeśli użytkownik poda 30, muszę wykonać numer 30/100 *. Dane wejściowe zawsze będą liczbą całkowitą. Jak przeprowadzić podział w tym scenariuszu?
Vrushank Doshi
Zamień liczby całkowite na liczby zmiennoprzecinkowe.
Muffin Top
Próbowałem fmt.Println (float64 (3/10)), ale daje mi 0
Vrushank Doshi
7
@VrushankDoshi: fmt.Println(float64(3) / float64(10))daje 0.3.
peterSO
20

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

Przykład

robstarbuck
źródło
Tak! tylko pierwszy operand
SMMousavi