İstediğim şey, bir ikiliyi yarı-yukarı yöntemini kullanarak yuvarlayan bir dizeye dönüştürmek için bir yöntemdir - yani, yuvarlanacak ondalık sayı 5 ise, her zaman bir sonraki sayıya yuvarlar. Bu, çoğu insanın çoğu durumda beklediği standart yuvarlama yöntemidir.
Ayrıca sadece anlamlı rakamların görüntülenmesini istiyorum - yani sonda sıfır olmamalı.
Bunu yapmanın bir yönteminin String.format
yöntemini kullanmak olduğunu biliyorum:
String.format("%.5g%n", 0.912385);
geri döner:
0.91239
Bu harika, ancak anlamlı olmasalar bile sayıları her zaman 5 ondalık basamakla görüntüler:
String.format("%.5g%n", 0.912300);
geri döner:
0.91230
Başka bir yöntem de DecimalFormatter
kullanmaktır:
DecimalFormat df = new DecimalFormat("#.#####");
df.format(0.912385);
geri döner:
0.91238
Ancak görebileceğiniz gibi bu, yarım çift yuvarlama kullanır. Yani bir önceki rakam çift ise aşağı yuvarlayacaktır. Benim istediğim şu:
0.912385 -> 0.91239
0.912300 -> 0.9123
Java'da bunu başarmanın en iyi yolu nedir?
setRoundingMode][1] kullanın, [
RoundingMode`]2'yi yarım çift turla ilgili sorununuzu ele almak için açıkça ayarlayın, ardından gerekli çıktınız için biçim modelini kullanın.
Örnek:
DecimalFormat df = new DecimalFormat("#.####");
df.setRoundingMode(RoundingMode.CEILING);
for (Number n : Arrays.asList(12, 123.12345, 0.23, 0.1, 2341234.212431324)) {
Double d = n.doubleValue();
System.out.println(df.format(d));
}
çıktısını verir:
12
123.1235
0.23
0.1
2341234.2125
EDIT: Orijinal cevap çift değerlerin doğruluğunu ele almamaktadır. Yukarı ya da aşağı yuvarlanmasını çok önemsemiyorsanız sorun değil. Ancak doğru yuvarlama istiyorsanız, değerlerin beklenen doğruluğunu hesaba katmanız gerekir. Kayan nokta değerleri dahili olarak ikili bir gösterime sahiptir. Bu, 2.77395 gibi bir değerin aslında dahili olarak tam olarak bu değere sahip olmadığı anlamına gelir. Biraz daha büyük veya biraz daha küçük olabilir. Dahili değer biraz daha küçükse, 2,7740'a yuvarlanmayacaktır. Bu durumu düzeltmek için, çalıştığınız değerlerin doğruluğunun farkında olmanız ve yuvarlamadan önce bu değeri eklemeniz veya çıkarmanız gerekir. Örneğin, değerlerinizin 6 basamağa kadar doğru olduğunu biliyorsanız, değerleri yarıya kadar yuvarlamak için bu doğruluğu değere ekleyin:
Double d = n.doubleValue() + 1e-6;
Aşağı yuvarlamak için doğruluğu çıkarın.
değerin bir
double` olduğunu varsayarak yapabilirsiniz:
(double)Math.round(value * 100000d) / 100000d
Bu 5 basamaklı hassasiyet içindir. Sıfırların sayısı ondalık sayısını gösterir.