Як привести дубль до int в Java, округливши його вниз?


77

Мені потрібно передати подвійне значення int в Java, але числове значення завжди повинно округлятися вниз. тобто 99,99999999 -> 99



Я вважаю, що плаваючі та подвійні - це різні типи даних у Java.
badpanda

Я думаю, що вони занадто близькі, тому що обидва вони - примітиви та типи з плаваючою комою. Відповіді однакові і, швидше за все, будуть такими і надалі.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1
Насправді, питання з плаваючою комою ставить точніше питання про те, як округляти плаваючу позицію (згідно з деяким невизначеним стандартом округлення). Це питання, яке, напевно, може бути перейменовано більш доречно на "Як округлити дубль до нуля і перенести на int у Java?" схоже на запитання, як настилити подвійну підлогу, за винятком того, що настил округляється до негативної нескінченності, а не до нуля. Відповіді досить різні, хоча заголовки запитань однакові.
badpanda 02

Відповіді:


141

Трансляція до int імпліцитно скидає десятковий знак. Не потрібно викликати Math.floor () (за умови позитивних чисел)

Просто введіть текст за допомогою (int), наприклад:

System.out.println((int)(99.9999)); // Prints 99

Math.floorЗважаючи на це, він має іншу поведінку, яка веде до негативної нескінченності (@Chris Wong)


27
Зверніть увагу , що Math.floor це справляє різний результат для негативних чисел , ніж просте приведення типів.
Джої

3
Це залежить від того, що означає ОП під «округленням вниз». Акторський склад округлює його "вниз" до нуля, тоді як Math.floor окружнює до негативної нескінченності.
Лямбда-фея

5
Також зауважте, що int не може представляти всі можливі цілі значення, які може мати подвійний. Якщо ви хочете скоротити значення подвійної точності, перетворіть на 64-бітове ціле значення, таке як long. System.out.println((long)(9.9999e300));
Монро Томас

1
Хоча правила округлення IEEE 754 використовують термін усічення для округлення до нуля та використовують синонімічні терміни округлення вниз і підлоги для округлення до негативної-нескінченності, Java BigDecimalта RoundingModeкласи використовує ROUND_DOWNдля округлення до нуля та ROUND_FLOORдля округлення до негативно-нескінченність.
Андреас

32

Щоб додати подвійну до int, і округлити її до найближчого цілого числа (тобто на відміну від типового (int)(1.8)і (int)(1.2), яке одночасно буде "округлятись вниз" до 0 і повертати 1), просто додайте 0,5 до того, doubleякий ви введете до anint .

Наприклад, якщо ми маємо

double a = 1.2;
double b = 1.8;

Тоді наступні вирази типового тестування для x та y повертають округлені значення ( x = 1і y = 1):

int x = (int)(a);   // This equals (int)(1.2) --> 1
int y = (int)(b);   // This equals (int)(1.8) --> 1

Але додавши 0,5 до кожного, ми отримаємо результат із округленим до найближчого цілого числа, який ми можемо побажати в деяких випадках ( x = 1і y = 2):

int x = (int)(a + 0.5);   // This equals (int)(1.8) --> 1
int y = (int)(b + 0.5);   // This equals (int)(2.3) --> 2

Як невелике зауваження , цей метод також дозволяє контролювати поріг, при якому doubleокругляється вгору або вниз при (int)наборі тексту.

(int)(a + 0.8);

набирати текст. Це буде округлюватися лише до (int)a + 1випадків, коли десяткові значення більше або дорівнюють 0,2. Тобто, додавши 0,8 doubleбезпосередньо перед наведенням тексту, 10,15 і 10,03 будуть округлені до 10 під час (int)випуску, але 10,23 і 10,7 будуть округлені до 11.


6
Ви повністю праві, це не так. Я побачив, що цей потік спливає, коли Google вводить "Java int typecast double", і зрозумів, що хтось, хто шукає спосіб округлити / зменшити безпосередньо за допомогою (int) typecast, може використовувати це. Це не розміщено за допомогою акаунта stackoverflow (тому я не намагаюся підвищити свою репутацію, якщо це сприймають тут серйозно), просто намагаюся допомогти поширити крутий трюк, яким я користуюся досить часто. :) Вітаємо!
JavaDrip 02

4
Приємно, але пам’ятайте, що це працює лише з позитивними дублями. Наприклад, якщо ви заокруглили -0,8 за допомогою цього фокусу, тоді код System.out.println(""+ (int)(-0.8d + 0.5))друкує 0, а не -1, як очікувалося
Гіл Вельях

17

(int)99.99999

Це буде 99. Відкидання дубля до int не округляється, це відкине дрібну частину.


11
Math.floor(n)

де n - подвійний. Здається, це фактично поверне подвійний, тому переконайтеся, що ви ввели його після.


2
Не потрібно підлоги перед тим, як брати участь, див. Відповідь Xorlev.
Мізіпзор

6
@miz: Однак для негативних чисел семантика відрізняється.
Joey



1

спробуйте з цим, це просто

double x= 20.22889909008;
int a = (int) x;

this will return a=20

або спробуйте з цим: -

Double x = 20.22889909008;
Integer a = x.intValue();

this will return a=20

або спробуйте з цим: -

double x= 20.22889909008;
System.out.println("===="+(int)x);

this will return ===20

можливо, цей код вам допоможе.



0

У цьому питанні:

1. Приведення подвійного до цілого числа є дуже простим завданням.

2.Але це не округлення подвійного значення з точністю до десяткової коми. Тому кастинг можна зробити так:

double d=99.99999999;
int i=(int)d;
System.out.println(i);

і він надрукує 99 , але округлення не зроблено.

Таким чином, для округлення ми можемо використовувати,

double d=99.99999999;
System.out.println( Math.round(d));

Це виведе на друк результат 100.

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