- Phát triển data.frame theo cách hiệu quả về bộ nhớ
- phát hiện rò rỉ bộ nhớ ruby/ruby on rails
- Không thể giải quyết việc nhập android.support.v7.app
- Ổ cắm miền UNIX và bộ nhớ chia sẻ (tệp được ánh xạ)
Tôi tình cờ phát hiện ra một hành vi kỳ lạ của NSDecimalNumber: đối với một số giá trị, hãy gọi giá trị nguyên
,Giá trị dài
,Giá trị dài dài
v.v., trả về giá trị không mong muốn (giá trị). Ví dụ:
hãy để v = NSDecimalNumber(chuỗi: "9.821426272392280061")
v // đánh giá là 9.821426272392278
v.intValue // đánh giá là 9
v.integerValue // đánh giá là -8
v.longValue // đánh giá là -8
v.longLongValue // đánh giá là -8
hãy để v2 = NSDecimalNumber(chuỗi: "9.821426272392280060")
v2 // đánh giá là 9.821426272392278
v2.intValue // đánh giá là 9
v2.integerValue // đánh giá là 9
v2.longValue // đánh giá là 9
v2.longLongValue // đánh giá là 9
Bài viết này sử dụng XCode 7.3; tôi chưa thử nghiệm với các phiên bản trước đó của framework này.
Tôi đã thấy rất nhiều về Số thập phân NSD
Thảo luận về hành vi làm tròn bất ngờ của và không sử dụng kế thừa Số NS
Bộ khởi tạo sẽ khởi tạo nó, nhưng tôi không thấy thông tin gì về hành vi cụ thể này. Nhưng, Có một số thảo luận khá chi tiết về biểu diễn nội bộ và làm tròn có thể chứa thông tin hữu ích mà tôi đang tìm kiếm, vì vậy xin lỗi trước nếu tôi bỏ lỡ.
biên tập:Vấn đề này nằm trong phần bình luận nhưng tôi đã gửi nó tới Apple với mã số #25465729. Mở Radar:http://www.openradar.me/radar?id=5007005597040640 .
Sửa đổi 2:Apple đã đánh dấu đây là bản sao của #19812966.
1 Câu trả lời
Vì bạn đã biết rằng vấn đề này là do "quá chính xác", bạn có thể khắc phục bằng cách làm tròn số thập phân trước:
hãy để b = NSDecimalNumber(chuỗi: "9.99999999999999999999")
in(b, "->", b.int64Value)
// 9.9999999999999999999 -> -8
hãy truncateBehavior = NSDecimalNumberHandler(roundingMode: .down,
thang đo: 0,
raiseOnExactness: đúng,
raiseOnOverflow: đúng,
raiseOnUnderflow: đúng,
raiseOnDivideByZero: đúng)
hãy để c = b.rounding(accordingToBehavior: truncateBehavior)
in(c, "->", c.int64Value)
// 9 -> 9
Nếu bạn muốn sử dụng int64Giá trị
(Ngay lập tức -longLongValue
), tránh sử dụng các số có độ chính xác lớn hơn 62 chữ số hoặc tổng cộng nhiều hơn 18 chữ số. Lý do được giải thích như sau.
NSDecimalNumber được biểu diễn nội bộ như Cấu trúc thập phân :
định nghĩa kiểu cấu trúc {
có dấu int _exponent:8;
số nguyên không dấu _length:4;
int không dấu _isNegative:1;
int không dấu _isCompact:1;
int không dấu _reserved:18;
unsigned short _mantissa[NSDecimalMaxSize]; // NSDecimalMaxSize = 8
} NSDecimal;
Điều này có thể được thực hiện bằng cách sử dụng.giá trị thập phân
Lấy ví dụ
hãy để v2 = NSDecimalNumber(chuỗi: "9.821426272392280061")
hãy để d = v2.giá trị thập phân
in(d._exponent, d._mantissa, d._length)
// -18 (30717, 39329, 46888, 34892, 0, 0, 0, 0) 4
Điều này có nghĩa là 9.821426272392280061 được lưu trữ nội bộ dưới dạng 9821426272392280061 × 10-18 — Xin lưu ý 9821426272392280061 = 34892 × 655363 + 46888 × 655362 + 39329 × 65536 + 30717.
Bây giờ hãy so sánh với 9.821426272392280060:
hãy để v2 = NSDecimalNumber(chuỗi: "9.821426272392280060")
hãy để d = v2.giá trị thập phân
in(d._exponent, d._mantissa, d._length)
// -17 (62054, 3932, 17796, 3489, 0, 0, 0, 0) 4
Lưu ý rằng số mũ được giảm xuống còn -17, nghĩa là Foundation bỏ đi các số không theo sau.
Biết được cấu trúc bên trong, tôi xin tuyên bố: Lỗi này là do34892 ≥ 32768. quan sát:
hãy để a = NSDecimalNumber(số thập phân: Số thập phân(
_exponent: -18, _length: 4, _isNegative: 0, _isCompact: 1, _reserved: 0,
_mantissa: (65535, 65535, 65535, 32767, 0, 0, 0, 0)))
hãy để b = NSDecimalNumber(số thập phân: Số thập phân(
_exponent: -18, _length: 4, _isNegative: 0, _isCompact: 1, _reserved: 0,
_mantissa: (0, 0, 0, 32768, 0, 0, 0, 0)))
in(a, "->", a.int64Value)
in(b, "->", b.int64Value)
// 9.223372036854775807 -> 9
// 9.223372036854775808 -> -9
Xin lưu ý rằng 32768 × 655363 = 263 Giá trị của chỉ đủ lớn để tràn số 64 bit có dấu. Vì vậy, tôi nghi ngờ rằng lỗi này là do Foundation đặt int64Giá trị
Được thực hiện như (1) Chuyển đổi mantissa trực tiếp thành Int64
, sau đó (2) chia cho 10 |Mục lục|.
Trên thực tế, nếu bạn tháo rời Foundation.framework, bạn sẽ thấy rằng về cơ bản nó làint64Giá trị
(Điều này không liên quan gì đến chiều rộng con trỏ của nền tảng).
nhưng tại sao int32Giá trị
Không bị ảnh hưởng? Bởi vì bên trong nó chỉ được thực hiện như Int32(self. giá trị kép)
, do đó sẽ không có vấn đề tràn. Thật không may, double chỉ có độ chính xác 53 bit, do đó Apple không có lựa chọn nào khác ngoài việc triển khai nó mà không có phép toán dấu phẩy động. int64Giá trị
(Yêu cầu độ chính xác 64 bit).
Liên quan đến iOS - NSDecimalNumber trả về giá trị số nguyên 64 bit không mong muốn, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/36322336/
Theo tình hình hiện tại, câu hỏi này không phù hợp với định dạng Hỏi & Đáp của chúng tôi. Chúng tôi mong đợi câu trả lời được hỗ trợ bằng sự kiện, tài liệu tham khảo hoặc chuyên môn, nhưng câu hỏi này có thể gây ra tranh luận, tranh cãi, thăm dò ý kiến hoặc thảo luận mở rộng. Nếu bạn cảm thấy vấn đề này có thể được cải thiện và có thể mở lại, hãy truy cập
Trong khi viết mã, tôi tự hỏi mình câu hỏi này: Liệu cách này có nhanh hơn: if(false) return true; else return false; so với cách này không? nếu(sai) trả về đúng; trả về
Làm thế nào để thực hiện "trả về" trong điều kiện logic? Điều này hữu ích trong những tình huống như thế này: checkConfig() || return false; var iNeedThis=doSomething() || return false
Đây là bản demo biểu thức chính quy của tôi Như câu hỏi đã nói: Nếu số đầu tiên là 1 thì trả về 1 Nhưng nếu là 145 thì trả về 145 Nhưng nếu là 133 thì trả về 133 Dữ liệu mẫu a: K'8134567 K'81345678
Khi xem qua các câu đố và câu trả lời trong phần Hỏi & Đáp của Code Golf, tôi đã tìm thấy giải pháp này cho câu trả lời tham chiếu phương pháp dài nhất và khó hiểu nhất trả về 1, int foo(void) { return! 0; } int bar(
Tôi muốn trả về JSON bên dưới. { "name": "jackie" } người đưa thư báo lỗi cho tôi. Mô tả Người mới bắt đầu và không mong đợi tham gia Spring Boot ở đây. 1 ngày tuổi. Có một cách đúng đắn để
Miễn là "is" trả về True thì "==" có trả về True không? Trong [101]: np.NAN là np.nan là np.NaN Out[101]: Đúng Trong [102]: np.NAN
Tôi cần biết thông tin chi tiết về tất cả sinh viên đang ở phòng số 6 hoặc 7 hoặc không ở phòng nào cả. Nếu họ ở trong những phòng khác thì nói một cách đơn giản, tôi không muốn có bản ghi đó. Sơ đồ của tôi là: students(roll_no, name,class,.
Tôi có một biểu mẫu mà tôi gửi tới php để chèn vào cơ sở dữ liệu mysql thông qua ajax. Mọi thứ đều ổn, php trả về giá trị "true", nhưng trong ajax thì lại hiển thị thông báo false. Ở đây bạn có thể xem mã php:
Tôi đang gặp phải một vấn đề so sánh giá trị rất lạ và không thể giải thích được trong Kotlin. Mã sau đây in ra dữ liệu giả lớp Foo ( val a: Byte ) fun main() { val NUM
Lưu ý rằng điều này không dành riêng cho Protractor. Vấn đề là Angular 2 sử dụng dịch vụ Testability tích hợp có tên là Protractor. Thước đo góc gọi Testabil
Trong cửa sổ gỡ lỗi, tất cả các biểu thức sau đều trả về 1. Ứng dụng.WorksheetFunction.CountA(Cells(4 + (i - 1) * rows_per_record, 28) & "
Tôi đang sử dụng jsonplaceholder (http://jsonplaceholder.typicode.com/) cục bộ. Tôi đang thử nghiệm các cuộc gọi GET và POST của mình thông qua extjs rest proxy
Sau đây là đoạn mã (đã sửa đổi) mà Postman cung cấp để gọi trang của tôi thành công. var client = new RestClient("http://sub.example.com/wp-json/wp/v2
Câu hỏi này đã có câu trả lời ở đây: Làm gì với các vấn đề mysqli? Các lỗi như mysqli_fetch_array(): Đối số #1 phải
Tôi đoán là tôi hơi kém hiểu biết về đối số dòng lệnh C. Tôi đã xem lại một số mã cũ của mình nhưng dù là phiên bản nào thì nó vẫn bị lỗi phân đoạn. Cách chạy nó là ./foo -n num (trong đó num là số do người dùng nhập vào dòng lệnh) nhưng bằng cách nào đó nó không hoạt động
Tôi đã viết một lớp để xử lý các kết nối đường ống được đặt tên và nếu tôi tạo một thể hiện, đóng nó lại, sau đó thử tạo một thể hiện khác, gọi CreateFile() trả về INVALID_HANDLE_VALUE và GetLastError
Mặc dù is_writable() trả về giá trị true nhưng tôi vẫn không thể ghi vào tệp. Tất nhiên, tập tin đó tồn tại và có thể đọc được. Đây là mã: $file = "data"; echo file_get_contents($file
Biến $response trong đoạn mã sau là NULL, mặc dù nó phải là giá trị của yêu cầu SOAP. (Danh sách thủy triều). Khi tôi gọi $client->__getLastResponse() tôi nhận được từ dịch vụ SOAP
Tôi đã tìm kiếm câu trả lời trên nhiều diễn đàn trực tuyến nhưng có vẻ như không có câu trả lời nào phù hợp với tình huống của tôi... Tôi đang sử dụng Windows 7, VS2010. Tôi có một ứng dụng sử dụng bộ đếm thời gian để gọi chức năng làm mới thanh tác vụ. Chức năng thanh tác vụ chứa lệnh gọi đến LoadI
Tôi là một lập trình viên xuất sắc, rất giỏi!