java'da double'ı tam sayıya dönüştürme


114

Java'da, double'ı tam sayıya dönüştürmek istiyorum, bunu yaparsan biliyorum:

double x = 1.5;
int y = (int)x;

y = 1 olsun. Eğer bunu yaparsan:

int y = (int)Math.round(x);

Muhtemelen 2 elde edeceksiniz. Ancak, merak ediyorum: tamsayıların çift temsilleri bazen 1.9999999998 gibi göründüğünden, Math.round () aracılığıyla oluşturulan bir çiftin dönüştürülmesinin yine de kesilmiş bir aşağı sayı ile sonuçlanma olasılığı var mı? aradığımız yuvarlatılmış sayıdan (yani: gösterilen kodda 2 yerine 1)?

(ve evet, bunu şu şekilde kastediyorum: x için herhangi bir değer var mı , burada y, x'in yuvarlatılmış bir temsilinden ziyade kesilmiş bir sonuç gösterecek mi?)

Eğer öyleyse: Kesilme riskini göze almadan yuvarlatılmış bir int'e çift yapmanın daha iyi bir yolu var mı?


Bir şey buldum: Math.round (x), bir çift değil, bir uzun döndürür. Dolayısıyla: Math.round () 'un 3.9999998 gibi görünen bir sayı döndürmesi imkansızdır. Bu nedenle, int (Math.round ()) hiçbir zaman hiçbir şeyi kısaltmak zorunda kalmayacak ve her zaman çalışacaktır.


6
Math.round (double), double değil uzun döndürür.
qbert220

Yanıtlar:


95

üzerinden oluşturulan bir çift yayınlamanın Math.round()yine de kesilmiş bir sayı ile sonuçlanması ihtimali var mı

Hayır, round()çiftinizi her zaman doğru değere yuvarlar ve ardından, longherhangi bir ondalık basamağı kesecek bir sayıya dönüştürülür. Ancak yuvarlamadan sonra, herhangi bir kesirli parça kalmayacaktır.

İşte şuradaki dokümanlar Math.round(double):

Bağımsız değişkene en yakın uzunluğu döndürür. Sonuç, 1/2 eklenerek, sonucun tabanı alınarak ve sonucu long yazıya dönüştürülerek bir tam sayıya yuvarlanır. Başka bir deyişle, sonuç ifadenin değerine eşittir:

(long)Math.floor(a + 0.5d)

3
Önemli olan nokta, yuvarlamanın yuvarlama yöntemi dahilinde yapılmasıdır. Bir int'e güvenli bir şekilde dönüştürülebilen uzun bir değer döndürülür (döndürülen değerin her zaman int aralığında olacağı varsayılarak).
qbert220

Evet. A / long / to int veren problemleri hayal edemiyorum. Açıkçası! Bunu
anlamalıydım

1
Yuvarlama nedeniyle kesmenin gerçekleşmeyeceği doğru olsa da, çok büyük sayı [max double: 1.7976931348623157E308]olan double'dan int'e çok daha küçük olan çevrimden dolayı beklenen sonuçları hala alamayabilirsiniz [max int: 2147483647]. Sadece akılda tutulması gereken bir şey.
Nelda.techspiress

22

Veri türü Doubleiçin intaşağıdakileri kullanabilirsiniz:

Double double = 5.00;

int integer = double.intValue();

Yuvarlatılmış bir değer arıyor.
Marquis of Lorne

1
Bunun 4.99999999999 için beklediğinizi vereceğini sanmıyorum (5 değil 4 verecek)
2019

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.