2009-05-25 39 views
14

Tôi đang cố tính phần trăm "yếu tố". Tức là, được đưa ra 20%, chuyển đổi nó thành 0,2 (ý định của tôi là sau đó nhân giá trị bằng cách đó và nhận 20% giá trị).Java, BigDecimal. Các vấn đề với sự phân chia

Dù sao, câu hỏi có liên quan với đoạn mã này:

public static void main(String[] args) { 
    int roundingMode = BigDecimal.ROUND_FLOOR; 
    BigDecimal hundred = new BigDecimal("100"); 
    BigDecimal percentageFactor = null; 
    BigDecimal percentage = new BigDecimal("20"); 
    BigDecimal value = new BigDecimal("500"); 
    percentageFactor = percentage.divide(hundred, roundingMode); 
    float f = percentage.floatValue()/hundred.floatValue(); 
    f = value.floatValue() * f; 
    BigDecimal aux = value.multiply(percentageFactor); 
    System.out.println("factor:"+percentageFactor.toString()); 
    System.out.println("final falue:"+aux.toString()); 
    System.out.println("Float Value:"+f);  
} 

Tôi mong chờ kết quả của điều này là một cái gì đó như:

factor: 0.2 
final value: 100 
float value: 100 

nhưng thay vì percentage.divide(hundred, roundingMode); đang trở lại bằng không, một do đó tôi nhận được:

factor:0 
final falue:0 
Float Value:100.0 

Tôi đang làm gì sai? Làm thế nào tôi có thể chia hai số thập phân lớn đúng cách?

Nhân tiện, tôi đang sử dụng BigDecimal vì tôi sẽ tính phần trăm tiền tệ, vì vậy tôi muốn kiểm soát việc làm tròn.

Trả lời

9

Quy mô new BigDecimal("20") là zero vì bạn đã không có dấu thập phân trong đó. Điều đó có nghĩa là percentage.divide(hundred, BigDecimal.ROUND_FLOOR) của bạn sẽ tạo ra không (đó là hiệu quả int(20/100) hoặc 0).

Nếu bạn thực sự muốn làm công cụ phân đoạn, hãy sử dụng new BigDecimal("20.00") để quy mô được đặt chính xác hoặc sử dụng một trong các nhà thầu khác để đặt tỷ lệ cụ thể.

Dưới đây là kết quả từ sự thay đổi đơn giản của 20-20.00, hoàn chỉnh với misteak spellink bạn :-)

factor:0.20 
final falue:100.00 
Float Value:100.0 
13

Tôi nghĩ rằng giải pháp tốt nhất là để thiết lập quy mô yêu cầu khi phân chia: Trong trường hợp này có lẽ 2.

BigDecimal hundred = new BigDecimal(100); 
    BigDecimal percentage = new BigDecimal(20); 
    BigDecimal value = new BigDecimal(500); 
    BigDecimal percentageFactor = 
       percentage.divide(hundred,2, BigDecimal.ROUND_HALF_UP); 

    value = value.multiply(percentageFactor); 
    System.out.println("final value:"+ value); 

giá trị cuối cùng 100,00

(Phép nhân đang sử dụng quy mô từ các yếu tố (0 + 2) nhưng nó có thể b e quy định quá.)

Tôi muốn sử dụng HALF_UP cho kế toán (theo pháp luật của tôi) hoặc EVEN (cho thống kê) cho chế độ làm tròn.

0

phao chỉ có 6 chữ số chính xác và gần như không bao giờ là lựa chọn tốt, tôi khuyên bạn nên sử dụng gấp đôi. (hoặc BigDecimal có thể tốt hơn trong một số trường hợp)

+0

Nếu bạn muốn kiểm soát làm tròn, bạn không nên sử dụng các số dấu phẩy động, không nổi hay tăng gấp đôi. Gắn bó với BigDecimal. – markusk

+0

Thường chỉ kết quả cuối cùng cần phải có kiểm soát làm tròn, vì vậy bạn đã sử dụng BigDecimal chỉ để làm tròn kết quả (hoặc một phương thức trợ giúp đơn giản) Điều này có thể đơn giản và nhanh hơn đáng kể. –

Các vấn đề liên quan