2012-01-06 26 views
14

Tôi đã đọc về các loại dữ liệu trong C. Tôi thấy phạm vi của long double là nhiều hơn số của double trong java. Đối với số lượng rất lớn, chúng tôi có thể sử dụng dài gấp đôi trong C. Nếu tôi muốn lưu trữ cùng một số trong java những gì chúng ta phải làm gì? loại dữ liệu nào chúng ta có thể sử dụng?Có bất kỳ sự thay thế nào dài gấp đôi trong java không?

đôi trong java có 8 byte (64 bit) IEEE 754. Nó bao gồm một loạt từ 4.94065645841246544e-324d để 1.79769313486231570e + 308d (tích cực hay tiêu cực).

longdouble in c takes 10 bytes (80 bits) 

bất cứ ai có thể cho tôi biết là có bất kỳ thay longdouble trong java

+3

Hãy thử BigDecimal. –

+0

Bigdecimal không phải là một dataype, chúng tôi không thể thực hiện các phép toán số học trực tiếp bằng cách sử dụng toán tử số học. –

+0

'long double' là trình biên dịch cụ thể trong C, trên hầu hết các nền tảng có cùng kích thước với' double'. –

Trả lời

9

Mặc dù không phải là sự thay thế, bạn có thể sử dụng java.lang.math.BigDecimal.You có thể lưu trữ hàng tỷ chữ số cho đến khi hết bộ nhớ. Một lớp chính xác tùy ý của nó, nó sẽ nhận được lớn như bạn muốn cho đến khi máy tính của bạn hết bộ nhớ.

Theo tài liệu của BigDecimal:

Bất biến, tùy tiện chính xác ký số thập phân. Một BigDecimal bao gồm giá trị số nguyên không chính xác tùy ý và một số nguyên nguyên 32-bit không âm 32 bit, đại diện cho số của chữ số ở bên phải dấu thập phân. Số được đại diện bởi BigDecimal là (unscaledValue/10scale). BigDecimal cung cấp các hoạt động cho phép tính số học cơ bản, thao tác tỷ lệ, so sánh, băm và chuyển đổi định dạng.

+1

Nhưng tôi không thể sử dụng toán tử số học để tính toán số học như cộng, trừ vv –

+0

@SunilKumarSahoo Nó có phương pháp làm điều tương tự. Người ta đã gợi ý rằng các toán tử hỗ trợ Java cho BigInteger và BigDecimal. –

+0

và BigDecimal không bị lỗi không chính xác –

3

Không có thay thế thẳng trong Java.

Bạn có thể sử dụng BigDecimal cho mục đích này.

Bạn nên hiểu rằng giá trị tăng gấp đôi của bạn càng lớn, độ mất chính xác càng lớn, bạn sẽ nhận được sử dụng nó trong các phép toán của bạn. BigDecimal giúp bạn biết vấn đề này.

Đây là mẫu mã với BigDecimal:

String decimalString = "1423545135143513.523"; 
BigDecimal decimal = new BigDecimal(decimalString); 

By this link bạn có thể tìm thấy nhiều ví dụ với việc sử dụng của lớp BigDecimal.

+0

Nhưng tôi không thể sử dụng toán tử số học để tính toán số học như cộng, trừ, vv –

+0

Bạn có thể. ví dụ. decimal.divide (new BigDecimal ("11.11")); Vui lòng đọc API bằng liên kết tôi đã đăng. Tôi đã chỉnh sửa bài đăng của mình, theo liên kết và tìm hiểu một số ví dụ. – Artem

+0

decimal.divide() không phải là toán tử, nó là phương thức? Tôi đã đề cập trong ý kiến ​​của tôi rằng chúng tôi không thể sử dụng toán tử số học –

2

Đối với kiểu nguyên thủy, không có dấu phụ nào từ kép và nổi, xử lý dấu phẩy động.

Nhưng, BigDecimal có thể là những gì bạn đang tìm kiếm.

+0

Nhưng tôi không thể sử dụng toán tử số học để tính toán số học như cộng, trừ vv –

+0

Bạn không thể sử dụng toán tử số học bình thường vì đây là một đối tượng. Bạn sẽ phải sử dụng các phương thức trong API, như .add(), .subtract(), vv ... Đó là một chút tẻ nhạt, nhưng bù lại, bạn sẽ có nhiều quyền lực hơn và các hoạt động ưa thích khác. Nhưng hãy cẩn thận với phân chia, bởi vì nó sẽ ném ngoại lệ nếu nó giống như 1/3, sau đó nó sẽ là mở rộng thập phân không chấm dứt. – HeavenAgain

1

Tài liệu của BigDecimal khẳng định:

add (BigDecimal augend) Trả về một BigDecimal có giá trị là (điều này + augend), và có quy mô là max (this.scale(), augend.scale()).

import java.math.BigDecimal; 

    public class AddTwoBigNumbers{ 
     public static void main(String[] args) { 
     BigDecimal num1, num2; 
     num1 = new BigDecimal(50.00035); 
     num2 = new BigDecimal(100.0025); 
     Sum(num1, num2); 
     } 

     public static void Sum(BigDecimal val1, BigDecimal val2){ 
     BigDecimal sum = val1.add(val2); 
     System.out.println("Sum of two BigDecimal numbers: "+ sum); 
     } 
    } 
0

Không, nhưng bạn có thể sử dụng Native Interface Java để gọi một phương thức bản địa mà thực hiện việc tính toán bằng cách sử dụng kiểu double dài.Sau đó bạn có thể lưu trữ nó trong 10 byte hoặc cắt bớt nó.

Nếu việc cắt ngắn cuối cùng thành gấp đôi có thể chấp nhận được, tùy thuộc vào máy ảo bạn sử dụng, có thể các giá trị trung gian được lưu trữ trong thời gian dài gấp đôi. Trong trường hợp này, bạn không cần phương thức gốc.

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