Ölçek ve yuvarlak


140

Bu iki çağrı arasındaki fark nedir? (Var mı?)

// 1.
new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP));
// 2.
new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP);

6
aşağıdaki kabul edilen cevaplar dışında - setScale (), değişmez bir sınıf verildiğinde yeni bir BigDecimal nesnesi oluşturur
prash

9
@prash roundyöntem de yeni bir BigDecimal örneği döndürür, çünkü dediğin gibi örnekler değişmezdir.
daiscog

Yanıtlar:


212

Belirtilen ancak doğrudan ele alınmayan önemli bir nokta, "kesinlik" ve "ölçek" arasındaki fark ve bunların iki ifadede nasıl kullanıldığıdır. "duyarlık" , bir sayıdaki toplam anlamlı basamak sayısıdır. "ölçek" , ondalık ayırıcının sağındaki basamak sayısıdır.

MathContext yapıcısı yalnızca duyarlık ve RoundingMode değerlerini bağımsız değişken olarak kabul eder ve bu nedenle ölçek hiçbir zaman ilk ifadede belirtilmez.

setScale() ölçeği RoundingMode'un yanı sıra bir argüman olarak açıkça kabul eder, ancak ikinci ifadede kesinlik asla belirtilmez.

Ondalık noktayı bir yer sağa taşırsanız fark netleşir:

// 1.
new BigDecimal("35.3456").round(new MathContext(4, RoundingMode.HALF_UP));
//result = 35.35
// 2.
new BigDecimal("35.3456").setScale(4, RoundingMode.HALF_UP);
// result = 35.3456

38
Re: "" duyarlık "bir sayıdaki toplam basamak sayısıdır." Hayır. Hassasiyet, önemli basamakların sayısıdır. 0.000042M'nin hassasiyeti 2'dir.
David J.

2
Bakınız: "duyarlık": Rakam sayısı, kesin sonucun sıfırdan büyük olmayan rakamından başlar. docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html
Eddy

"Hassasiyet önemli basamak sayısı" ise 0.0000009 hassasiyeti neden 2 olarak geliyor? 1 olmalı
Sanchi Girotra

1
BigDecimal'inizin değeri nasıl ayarlanır? Değeri nasıl çıkarıyorsunuz (bir String.format () kullanarak önemli basamakları gizleyebilir)?
dale peters

1
@SanchiGirotra Kesinlik "ölçeklenmemiş değerdeki basamak sayısı" dır. Ölçeklendirilmemiş değeri 90 olan bir 2 hassasiyeti ve 8 ölçeği 0.0000009 verir. 1 hassasiyeti, ölçeksiz 9 değeri ve 7 ölçeği gibi
daiscog

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.