Як виконати ділення в Go


88

Я намагаюся виконати просте ділення в Go.

fmt.Println(3/10)

При цьому друкується 0 замість 0,3. Це якось дивно. Не могли б хтось поділитися, в чому причина цього? я хочу виконувати різні арифметичні дії в Go.

Дякую

Відповіді:


90

Вираз 3 / 10є нетипізованим постійним виразом. Специфікація говорить це про константні вирази

якщо операнди двійкової операції є різними типами нетипізованих констант, операція, а для небулевих операцій результат використовує вид, який з'являється далі в цьому списку: ціле число, руна, плаваюча крапка, комплекс.

Оскільки 3і 10є нетипізованими цілими константами, значення виразу є нетипізованим цілим числом ( 0у даному випадку).

Один з операндів повинен бути константою з плаваючою точкою для результату до константи з плаваючою точкою. Наступні вирази обчислюють нетипізовану константу з плаваючою точкою 0.3:

3.0 / 10.0
3.0 / 10
3 / 10.0

Також можна використовувати набрані константи. Наступні вирази оцінюють як float64константу 0.3:

float64(3) / float64(10)
float64(3) / 10
3 / float64(10)

Друк будь-якого з наведених вище виразів надрукує 0.3. Наприклад, fmt.Println(3.0 / 10)відбитки 0.3.


я беру введення, припускаючи, що це відсоток. Наприклад, якщо користувач дає 30, я повинен виконати 30/100 * деяке число. Вхідними даними завжди буде ціле число. Як виконати поділ у цьому сценарії?
Vrushank Doshi

Перетворення цілих чисел у числа з плаваючою комою.
Muffin Top

я спробував fmt.Println (float64 (3/10)), але це дає мені 0
Vrushank Doshi

7
@VrushankDoshi: fmt.Println(float64(3) / float64(10))дає 0.3.
peterSO

21

Як згадував @Cerise і відповідно до специфікації

Арифметичні оператори застосовуються до числових значень і дають результат того самого типу, що і перший операнд.

У цьому випадку лише перший операнд повинен бути плаваючою комою.

fmt.Println(3.0/10)
fmt.Println(float64(3)/10)
// 0.3 0.3

Приклад


Так! лише перший операнд
SMMousavi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.