2010-05-19 82 views
38

BigDecimal là một lớp học trong gói java.math có nhiều lợi ích để xử lý các số lớn của một quy mô nhất định. Có một lớp hoặc kiểu dữ liệu tương đương trong C# với tính năng này không.Tương đương với lớp Java BigDecimal trong C# là gì?

+0

Bản sao có thể có của [Có lớp BigFloat trong C# không?] (Http://stackoverflow.com/questions/10359372/is-there-a-bigfloat-class-in-c) –

Trả lời

25

C# chỉ có BigInteger xây dựng nó (trong khuôn khổ .NET 4).

Có phải decimal đủ chính xác cho công việc của bạn không? Đó là số 128 bit có thể chứa các giá trị trong phạm vi ± 1.0 × 10 −28 đến ± 7.9 × 10 .

+4

Lớp BigRational cũng bật theo cách của nó. Hiện đang ở giai đoạn beta. –

+0

@RaheelKhan bạn có ý gì không? https://msdn.microsoft.com/de-de/library/microsoft.solverfoundation.common.rational(v=vs.93).aspx –

+0

@JanusTroelsen Không, anh ấy thực sự có nghĩa là http://bcl.codeplex.com/ release/view/42782 – MrCC

4

Vâng, ngoài việc sử dụng thư viện của bên thứ ba với sự hỗ trợ của BigDecimal (nếu chúng tồn tại), không có cách giải quyết dễ dàng. Cách dễ dàng nhất, như xa như tôi đang quan tâm là phải thực hiện một số thập phân (từ mono ví dụ) và để viết lại nó bằng cách sử dụng loại BigInteger. Trong nội bộ, trong thực hiện của mono, loại thập phân được tạo thành từ ba số nguyên. Vì vậy, tôi không nghĩ rằng sẽ khó thực hiện. Tôi không chắc chắn về hiệu quả mặc dù. Tuy nhiên, trước tiên bạn nên xem xét sử dụng loại thập phân chuẩn như codeka được đề cập.

3

Đây là thư viện C# thực hiện những gì bạn đang tìm kiếm và trong một số trường hợp có chức năng bổ sung: http://www.fractal-landscapes.co.uk/bigint.html (hoặc thử tại http://web.archive.org/web/20110721173046/http://www.fractal-landscapes.co.uk/bigint.html).

Ví dụ, nó có một chức năng căn bậc hai, mà BigDecimal không có:

PrecisionSpec precision = new PrecisionSpec(1024, PrecisionSpec.BaseType.BIN); 
BigFloat bf = new BigFloat(13, precision); 
bf.Sqrt(); 
Console.WriteLine(bf.ToString()); 

Wikipedia có một danh sách các thư viện khác như tại http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic#Libraries

+0

404: Thư viện không còn khả dụng? – Shlomo

+0

Đã thêm liên kết archive.org. – RedGreenCode

+0

Liên kết đã chết và archive.org không giữ các tệp zip mã nguồn. – kristianp

36

Chỉ gần đây tôi cũng cần một độ chính xác tùy ý số thập phân trong C# và đi qua ý tưởng được đăng tại đây: https://stackoverflow.com/a/4524254/804614

Sau đó tôi hoàn thành dự thảo để hỗ trợ tất cả toán tử số học và so sánh cơ bản, cũng như chuyển đổi đến và từ tất cả các số điển hình ical các loại và một vài phương pháp mũ, mà tôi cần thiết tại thời điểm đó.

Nó chắc chắn không phải là toàn diện, nhưng rất chức năng và hầu như sẵn sàng để sử dụng. Vì đây là kết quả của một đêm mã hóa, tôi không thể đảm bảo rằng điều này là lỗi miễn phí hoặc hoàn toàn chính xác, nhưng nó làm việc tuyệt vời cho tôi. Dù sao, tôi muốn xuất bản nó ở đây vì tôi không tìm cách nào khác để sử dụng các số thập phân chính xác tùy ý trong C# mà không cần phải bao gồm các thư viện khổng lồ (hầu hết không phải là .net, nhưng trình bao bọc cho C++), đi kèm với tất cả các loại không cần thiết đồ đạc.

Ý tưởng cơ bản là xây dựng một loại dấu phẩy động tùy chỉnh với một mantissa lớn tùy ý sử dụng loại BigInteger của .NET 4.0 và số mũ cơ sở 10 (Int32).

Nếu bạn tìm thấy lỗi/không chính xác, có đề xuất hoặc bất kỳ điều gì mang tính xây dựng, vui lòng chỉnh sửa bài đăng trực tiếp hoặc để lại nhận xét để tôi có thể cải thiện câu trả lời.

Tôi không hoàn toàn chắc chắn nếu đây là nơi tốt nhất để đặt điều này, nhưng đây là một trong những câu hỏi hàng đầu về SO về chủ đề này và tôi thực sự muốn chia sẻ giải pháp của tôi.;)

EDIT: Tôi chuyển việc thực hiện để GitHubGist: https://gist.github.com/JcBernack/0b4eef59ca97ee931a2f45542b9ff06d

+0

Công việc tuyệt vời! Điều này có ích cho nỗ lực tính toán PI của tôi. – vbocan

+0

Điều này thật tuyệt. Một gợi ý tôi có thể thực hiện không phải là phủ nhận phần định trị trong toán tử '-' đơn nhất của bạn, thay vào đó trả về một' BigDecimal' mới với phần tử phủ định phủ định, cho bất biến. Nếu không, bạn có thể thấy rằng 'BigDecimal x = 1.01, y = -x' có tác dụng không mong muốn của' x == y == -1.01'. – jimbobmcgee

+2

@jimbobmcgee Đầu tiên tôi nghĩ rằng bạn đã đúng và đã chỉnh sửa câu trả lời, nhưng sau đó tôi nhận ra một lần nữa rằng 'BigDecimal' là một cấu trúc. Điều đó có nghĩa là đối số vào toán tử đơn nguyên đã là bản sao của bản gốc khiến nó không thể vô tình sửa đổi nó. – Gigo

1

Deveel Math

GitHub:

https://github.com/deveel/deveel-math

Author GitHub:

Antonello Provenzano

Hỗ trợ:

  • BigComplex
  • BigDecimal
  • BigMath
  • Rational
  • ...

Làm thế nào để Cài đặt Nó

Từ NuGet Package Management Console, chọn dự án nơi thư viện sẽ được cài đặt và gõ lệnh sau

PM> Install-Package dmath 
+0

Tôi sẽ không tin thư viện này. Tôi đã có một số trường hợp một bổ sung thất bại với một lỗi "sức mạnh của 10 quá lớn" cũng như trường hợp khác bằng cách sử dụng BigDecimal nơi 0.5> 1e-20 trả về false –

+0

Thư viện xuất sắc – user1018697

2

Điều này có thể không có được một lựa chọn khi câu hỏi ban đầu được đăng, nhưng một cách thực sự dễ dàng để sử dụng một BigDecimal trong C# mã của bạn là cài đặt gói IKVM.NET qua NuGet:

PM> Install-Package IKVM 

Sau đó, thực hiện chính xác như bạn làm trong Java:

using System; 
using java.math; 

namespace BigDecimalDemo 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      int n = int.Parse(args[0]); 
      Console.WriteLine(Factorial(n)); 
     } 

     static BigDecimal Factorial(int n) 
     { 
      return n == 1 
       ? BigDecimal.ONE 
       : Factorial(n - 1).multiply(new BigDecimal(n)); 
     } 
    } 
} 

Tùy thuộc vào cách xa bạn đi với IKVM có thể có vấn đề interop thỉnh thoảng để vấp ngã nhưng theo kinh nghiệm của tôi, nó thường hoạt động tốt cho những thứ đơn giản như thế này.

+0

IKVM là công cụ tuyệt vời để đưa mã java vào một dự án C# , nhưng việc thêm toàn bộ thư viện lớp java vào dự án của bạn chỉ để mang lại một lớp tương đối đơn giản có vẻ quá mức cần thiết. – Sprotty

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