Відповіді:
Два операнди (1 і 3) є цілими числами, тому використовується ціла арифметика (поділ тут). Оголошення змінної результату подвійним просто викликає неявне перетворення після поділу .
Ціле ділення звичайно повертає справжній результат ділення, округлений до нуля. Таким чином, результат 0.333...
округлюється до 0. (Зауважте, що процесор насправді не проводить жодного округлення, але ви можете все це думати.)
Також зауважте, що якщо обидва операнди (числа) задані як плавні; 3.0 і 1.0, або навіть лише перший , тоді використовується арифметика з плаваючою комою, що дає вам 0.333...
.
DOWN
до нуля. Округлення FLOOR
йде до негативної нескінченності.
1/3
використовує ціле ділення, оскільки обидві сторони є цілими числами.
Ви повинні принаймні , один з них , щоб бути float
або double
.
Якщо ви вводите значення у вихідний код, як ваше запитання, ви можете це зробити 1.0/3
; 1.0
є подвійний.
Якщо ви отримуєте значення з інших місць, ви можете використовувати їх (double)
для перетворення int
в double
.
int x = ...;
int y = ...;
double value = ((double) x) / y;
ви повинні використовувати
double g=1.0/3;
або
double g=1/3.0;
Ціле ділення повертає ціле число.
Тому що ви робите ціле ділення.
Як говорить @Noldorin, якщо обидва оператори є цілими числами, то використовується ціле ділення.
Результат 0,33333333 не може бути представлений як ціле число, тому результату присвоюється лише ціла частина (0).
Якщо будь-який з операторів є double
/ float
, то має місце арифметика з плаваючою точкою. Але у вас буде та сама проблема, якщо ви це зробите:
int n = 1.0 / 3.0;
Оскільки він трактує 1 і 3 як цілі числа, тому округлюючи результат до 0, так що це ціле число.
Щоб отримати результат, який ви шукаєте, чітко скажіть java, що цифри вдвічі такі:
double g = 1.0/3.0;
Перетворення в JAVA досить просте, але потребує певного розуміння. Як пояснено в JLS для цілих операцій :
Якщо цілий оператор, окрім оператора зсуву, має принаймні один операнд типу довгий, то операція проводиться з використанням 64-бітової точності, а результат числового оператора має тип long. Якщо інший операнд не довгий, його спочатку розширюють (§5.1.5), щоб набрати довге шляхом числового просування (§5.6).
І приклад - це завжди найкращий спосіб перекладати JLS;)
int + long -> long
int(1) + long(2) + int(3) -> long(1+2) + long(3)
В іншому випадку операція проводиться з використанням 32-бітної точності, а результат числового оператора має тип int. Якщо будь-який операнд не є int, він спочатку розширюється на тип int за допомогою числового просування.
short + int -> int + int -> int
Невеликий приклад використання Eclipse, щоб показати, що навіть додавання двох short
s не буде таким простим:
short s = 1;
s = s + s; <- Compiling error
//possible loss of precision
// required: short
// found: int
Для цього знадобиться лиття з можливою втратою точності.
Те саме стосується і операторів плаваючою точкою
Якщо хоча б один з операндів числовому оператору має тип подвійний, то операція проводиться за допомогою арифметики з плаваючою комою з 64 бітами, а результат числового оператора - значення типу подвійне. Якщо інший операнд не є подвійним, його спершу розширюють (§5.1.5), щоб набрати подвійне числове просування (§5.6).
Тож просування робиться на поплавці в подвійний.
І суміш як цілого, так і плаваючого значення призводить до плаваючих значень, як було сказано
Якщо хоча б один із операндів двійкового оператора має тип з плаваючою комою, то операція є операцією з плаваючою комою, навіть якщо інша є цілісною.
Це стосується двійкових операторів, але не для "Операторів призначення" +=
Для підтвердження цього достатньо простого робочого прикладу
int i = 1;
i += 1.5f;
Причина в тому, що тут робиться неявна роль, це буде виконуватися як би
i = (int) i + 1.5f
i = (int) 2.5f
i = 2
1 і 3 є цілими контактами, і тому Java робить цілочисельний поділ, результат якого дорівнює 0. Якщо ви хочете записати подвійні константи, потрібно записати 1.0
і 3.0
.
Найпростіше рішення просто зробити це
double g = ((double) 1 / 3);
Це робить, оскільки ви не ввели 1.0 / 3.0, - це дозволити вам вручну перетворити його в тип даних подвійний, оскільки Java припускає, що це розділення Integer, і це буде робити це, навіть якщо це означало звуження перетворення. Це те, що називається оператором лиття.
Я зробив це.
double g = 1.0/3.0;
System.out.printf("%gf", g);
Використовуйте .0, роблячи подвійні обчислення, інакше Java припустить, що ви використовуєте цілі. Якщо для обчислення використовується будь-яка кількість подвійних значень, то вихід буде подвійним значенням. Якщо всі цілі числа, то вихід буде цілим числом.
(1/3) означає поділ цілого числа, ось чому ви не можете отримати десяткове значення з цього поділу. Щоб вирішити цю проблему, використовуйте:
public static void main(String[] args) {
double g = 1.0 / 3;
System.out.printf("%.2f", g);
}
public static void main(String[] args) {
double g = 1 / 3;
System.out.printf("%.2f", g);
}
Оскільки і 1, і 3 є входами, результат не округлюється, а є усіченим. Так ви ігноруєте дроби і берете лише цілі.
Щоб уникнути цього, майте принаймні одне з ваших чисел 1 або 3 у вигляді десяткової форми 1.0 та / або 3.0.
Спробуйте це:
public static void main(String[] args) {
double a = 1.0;
double b = 3.0;
double g = a / b;
System.out.printf(""+ g);
}
Зробіть "подвійний g = 1,0 / 3,0;" замість цього.
Багато інших не зазначили справжнього питання:
Операція з лише цілими числами кидає результат операції на ціле число.
Це обов'язково означає, що результати з плаваючою комою, які можуть відображатися у вигляді цілого числа, будуть усіченими (відключити десяткову частину).
Що ви запитуєте ( кастинг / перетворення типів), яке ви запитуєте?
Це залежить від мовної реалізації, але у Вікіпедії досить вичерпний погляд, і він також говорить про примус , який є ключовою інформацією при відповіді на ваше запитання.
1/2
, не на цільовій мові (java), не використовується кастинг типу або перетворення типів . Ви просто викликаєте ціле ділення, що призведе до цілого результату. Кастинг типів відбувається лише завдяки перетворенню вгору з int
до double
під час призначення.
0.5
. Просто в Java 1/2
- це ціле ділення, яке призводить до нульового цілого числа. Ви можете призначити нуль подвійному, він все одно буде нулем, хоч і 0.0
подвійним.
int i = .99999999
встановлює int до 0. Більш конкретно, він займає цілу частину і відкидає решту.