2010-04-09 26 views
5

giả sử tôi có kịch bản IronPython sau:Có ký hiệu chữ cho thập phân trong IronPython không?

def Calculate(input): 
    return input * 1.21 

Khi gọi từ C# với một số thập phân, hàm này trả về một đôi:

var python = Python.CreateRuntime(); 
dynamic engine = python.UseFile("mypythonscript.py") 

decimal input = 100m; // input is of type Decimal 
// next line throws RuntimeBinderException: 
//  "cannot implicitly convert double to decimal" 
decimal result = engine.Calculate(input); 

tôi dường như có hai lựa chọn:

Đầu tiên , Tôi có thể cast ở phía bên C#: có vẻ như không đi vì tôi có thể mất độ chính xác.

decimal result = (decimal)engine.Calculate(input); 

tùy chọn thứ hai là sử dụng System.Decimal trong kịch bản python: tác phẩm, nhưng ô nhiễm kịch bản hơi ...

from System import * 

def CalculateVAT(amount): 
    return amount * Decimal(1.21) 

Có một ký hiệu DLR ngắn tay rằng số 1,21 nên được hiểu là một số thập phân, giống như tôi sẽ sử dụng ký hiệu '1,21m' trong C#? Hoặc là có cách nào khác để thực thi thập phân được sử dụng thay vì tăng gấp đôi?

Trả lời

4

Nhìn vào python docs:

trường hợp số thập phân có thể được xây dựng từ số nguyên, chuỗi, hoặc tuples. Để tạo một số thập phân từ một float , trước tiên hãy chuyển đổi nó thành một chuỗi. Đây là lời nhắc rõ ràng về các chi tiết chi tiết về chuyển đổi (bao gồm lỗi đại diện).

Unfortunatelly không có ký hiệu viết tay bạn đang tìm kiếm. Ngay cả python cũng không có. Cách tiêu chuẩn của 'cứng mã hóa' một số thập phân là phải vượt qua một chuỗi đại diện cho các nhà xây dựng số thập phân:

from decimal import Decimal 
my_decimal = Decimal("1.21") 

Nếu bạn đang viết mã mà là nặng trên .net interop đi (nó có vẻ như bạn đang có) nó có thể tốt hơn chỉ bằng cách sử dụng kiểu dữ liệu thập phân .net ngay lập tức, như bạn đã tự đề xuất. Tuy nhiên, lưu ý rằng bạn chuyển một số dấu phẩy động đến hàm tạo thập phân trong ví dụ này. Bạn có thể nhận được một lỗi nhỏ trong độ chính xác từ việc chuyển đổi, nếu số có nhiều hơn nữa chữ số thập phân:

from System import * 
my_decimal = Decimal(1.21) 

Vì vậy, bạn có thể tốt hơn bằng cách sử dụng quá tải constructor này:

from System import * 
my_decimal = Decimal(121, 0, 0, False, 2) 

Không phải là đẹp nhất và cách ngắn nhất để làm những gì bạn muốn, nhưng tốt nhất về hiệu suất và độ chính xác.

+0

Cảm ơn. Tôi sẽ gắn với ký hiệu Thập phân (1,21). Trong trường hợp này, tôi có thể sống với các nhà xây dựng từ một điểm nổi, vì sẽ không có mất chính xác trong trường hợp của tôi. Tôi quan tâm nhiều hơn đến kết quả tính toán. – jeroenh

3

có vẻ như không hoạt động vì tôi có thể mất độ chính xác.

Yeah, bạn làm điều đó trong phương pháp khác nữa:

Decimal(1.21) 

Một khi bạn đã viết 1.21 đó là một số dấu chấm động và bạn đã bị mất độ chính xác đầy đủ trước khi thậm chí đi qua nó để các Decimal constructor.Đó là lý do có nguồn gốc lớp Decimal Python phải được khởi tạo từ một chuỗi, không phải là một float:

decimal.Decimal('1.21') 

Có vẻ như không phải là một nhà xây dựng tương tự cho Decimal NET, nhưng bạn có lẽ có thể làm điều đó bằng cách sử dụng constituent parts constructor:

System.Decimal(121, 0, 0, False, 2) 
Các vấn đề liên quan