Đây là chìa khóa cho tình trạng khó khăn của bạn: 10
là sản phẩm của 2
và 5
. Bạn có thể đại diện cho bất kỳ số lượng chính xác trong cơ sở 10 số thập phân đó là k * 1/2 n * 1/5 m nơi k
, n
và m
là số nguyên.
Các cụm từ khác - nếu số n
trong 1 / n chứa một yếu tố không phải là một phần của các yếu tố của cơ sở, thì số đó sẽ không thể được biểu diễn chính xác trong một số chữ số cố định trong nhị phân / thập phân / bất kỳ sự mở rộng nào của số đó số - nó sẽ có một phần lặp lại. Ví dụ 1/15 = 0,0666666666 .... vì 3 (15 = 3 * 5) không phải là hệ số 10.
Do đó, bất cứ điều gì có thể được biểu diễn trong cơ sở 2 chính xác (k * 1/2 n ) đều có thể được biểu diễn chính xác trong cơ sở 10.
Ngoài ra, vấn đề là bạn đang sử dụng bao nhiêu chữ số / bit để thể hiện số đó. Có một số số có thể được biểu diễn chính xác trong một số cơ sở, nhưng phải mất nhiều hơn một số chữ số / bit để làm.
Trong nhị phân, số 1/10 thuận tiện là 0,1 trong số thập phân không thể được biểu diễn dưới dạng số có thể được biểu diễn trong một số bit cố định trong nhị phân. Thay vào đó, số là 0,00011001100110011 ... 2 (với phần 0011 lặp lại mãi mãi).
Hãy nhìn vào các số 1 2 /1010 2 một chút chặt chẽ hơn.
____
0,00011
+ ---------
1010 | 1,00000
0
-
1 0
0
----
1 00 --------- +
0 |
----- |
1 000 |
0 |
------ | lặp lại
1 0000 | khối
1010 |
------ |
1100 |
1010 |
---- |
100 ---- +
Đây chính xác là cùng một loại điều bạn nhận được khi bạn cố gắng thực hiện phép chia dài cho 1/3.
1/10, khi bao thanh toán là 1 / (2 1 * 5 1 ). Đối với cơ sở 10 (hoặc bất kỳ bội số nào của 10), số này chấm dứt và được gọi là số thông thường . Một phần mở rộng thập phân lặp lại được gọi là số thập phân lặp lại và những số đó cứ tiếp tục mà không lặp lại là những số vô tỷ.
Các toán học đằng sau này đào sâu vào định lý nhỏ Fermat ... và một khi bạn bắt đầu nói Fermat hoặc định lý, nó trở thành một câu hỏi Math.SE .
Có những con số không thể biểu diễn trong cơ sở 10 nhưng có thể được biểu diễn trong cơ sở 2 không?
Câu trả lời là không'.
Vì vậy, tại thời điểm này, tất cả chúng ta nên rõ ràng rằng mọi mở rộng nhị phân có độ dài cố định của một số hữu tỷ có thể được biểu diễn dưới dạng mở rộng thập phân có độ dài cố định.
Hãy xem xét kỹ hơn số thập phân trong C # dẫn chúng ta đến điểm nổi thập phân trong .NET và đưa ra cho tác giả, tôi sẽ chấp nhận rằng đó là cách nó hoạt động.
Kiểu thập phân có các thành phần giống như bất kỳ số dấu phẩy động nào khác: mantissa, số mũ và dấu. Như thường lệ, dấu hiệu chỉ là một bit đơn, nhưng có 96 bit mantissa và 5 bit lũy thừa. Tuy nhiên, không phải tất cả các kết hợp số mũ đều hợp lệ. Chỉ các giá trị 0-28 hoạt động và tất cả chúng đều có giá trị âm: giá trị số là . Điều này có nghĩa là các giá trị tối đa và tối thiểu của loại là +/- (2 96 -1) và số khác không nhỏ nhất về độ lớn tuyệt đối là 10 -28 .sign * mantissa / 10exponent
Tôi sẽ chỉ ra ngay rằng vì việc triển khai này có những con số thuộc double
loại không thể được đại diện trong decimal
- những con số nằm ngoài phạm vi. Double.Epsilon
là 4.94065645841247e-324
không thể được đại diện trong một decimal
, nhưng có thể trong một double
.
Tuy nhiên, trong phạm vi mà số thập phân có thể biểu thị, nó có nhiều bit chính xác hơn các loại gốc khác và có thể biểu diễn chúng mà không có lỗi.
Có một số loại khác trôi nổi xung quanh. Có một BigInteger trong C # có thể biểu thị một số nguyên lớn tùy ý. Không có tương đương với BigDecimal của Java (có thể biểu thị các số có chữ số thập phân dài tối đa 2 32 chữ số - chính xác là một phạm vi khá lớn) . Tuy nhiên, nếu bạn chọc ngoáy một chút, bạn có thể tìm thấy các triển khai cuộn bằng tay.
Có một số ngôn ngữ cũng có kiểu dữ liệu hợp lý cho phép bạn biểu diễn chính xác các tỷ lệ hợp lý (sao cho 1/3 thực sự là 1/3).
Đặc biệt cho C # và lựa chọn float hay hợp lý, tôi sẽ trì hoãn Jon Skeet từ pint nổi Decimal trong .NET :
Hầu hết các ứng dụng kinh doanh có lẽ nên sử dụng số thập phân thay vì float hoặc double. Nguyên tắc cơ bản của tôi là các giá trị nhân tạo như tiền tệ thường được biểu thị tốt hơn với dấu phẩy động thập phân: ví dụ, khái niệm chính xác là 1,25 đô la là hoàn toàn hợp lý. Đối với các giá trị từ thế giới tự nhiên, chẳng hạn như độ dài và trọng lượng, các loại dấu phẩy động nhị phân có ý nghĩa hơn. Mặc dù có một lý thuyết "chính xác là 1,25 mét" nhưng điều đó sẽ không bao giờ xảy ra trong thực tế: bạn chắc chắn sẽ không bao giờ có thể đo được độ dài chính xác, và chúng thậm chí không tồn tại ở cấp độ nguyên tử. Chúng ta đã quen với việc có một sự khoan dung nhất định liên quan.