2010-03-31 40 views
10

Cho phép xem xét chúng ta có một double R = 99.999999; (có thể thu được bằng cách là kết quả của một số tính toán khác), nay là đầu ra mong muốn là 99,99Cắt bớt đôi mà không làm tròn trong C

Tôi đã cố gắng sử dụng printf("%.2lf",R); nhưng nó làm tròn ra khỏi giá trị. Làm thế nào để có được kết quả mong muốn? (tốt nhất là sử dụng printf)

Trả lời

0

Bạn có thể nhân với 100 và sau đó cắt ngắn thành một số nguyên không? Sau đó, bạn có thể định dạng kết quả như một sẽ với đô la và xu. Đơn giản chỉ cần chia cho 100 có thể đưa bạn trở lại ở hình vuông một do các vấn đề biểu diễn dấu phẩy động.

+0

Không thực sự. Các biểu diễn điểm nổi kép tiêu chuẩn chính xác đến 15 chữ số. Vì vậy, trừ khi OP là đối phó với các con số trong mười tỷ đô la phạm vi anh ta nên được tốt. Trong mọi trường hợp, phép nhân chạy vào cùng một vấn đề biểu diễn dấu phẩy động. –

2

sprintf nó vào bộ đệm và sau đó đặt NUL char hai byte qua '.'

Sau đó, printf chuỗi cuối cùng của bạn bằng cách sử dụng chuỗi trung gian.

0

Còn việc sử dụng double trunc(double) từ GLibC thì sao?

+4

Vì không phải ai cũng dùng GLibC. –

+1

@Billy Câu hỏi không nói "Tôi không muốn sử dụng GLibC", vì vậy câu trả lời là hợp lệ, phải không? :) – Romain

+1

Có, nó hợp lệ. Đó là lý do tại sao tôi không downvote. Điều đó không nhất thiết làm cho nó tốt. :) –

10
#include <math.h> 
... 
    printf("%.2f", floor(100 * R)/100); 
+1

+1 nhưng vì câu hỏi được gắn thẻ C++ có thể cũng cung cấp cách thức C++ iostream? –

+1

Có một số trường hợp kỳ lạ mà điều này đưa ra câu trả lời sai không? Tôi không chắc chắn, nhưng có tồn tại một giá trị dấu chấm động f và một số nguyên n sao cho f nhỏ hơn giá trị chính xác của n/100, nhưng kết quả dấu phẩy động của f * 100 lớn hơn hoặc bằng n? Tất nhiên bạn có thể đặt câu hỏi liệu nó có quan trọng là f bị cắt ngắn "không chính xác", vì trong "không gian cơ sở 10", nó đại diện cho một phạm vi nằm trên một điểm đánh dấu 0,01. –

+1

Số âm có thể không? Với -99.999, nhân với -9999.9, tầng là -10000 và kết quả là -100. –

4

Tất cả những gì bạn phải làm là trừ 0,005 từ số và bản in ma thuật sẽ hoạt động như bạn muốn: luôn làm tròn xuống.

+2

Trừ khi số đó là số âm. Sau đó, nó sẽ nổ tung. –

+0

Bạn đánh bại tôi để chỉnh sửa ... nó không nổ tung. Nó chỉ làm ngược lại. Trong trường hợp này, hãy thêm 0,005. – frankc

+0

Điều đó có vẻ phức tạp hơn một chút so với câu trả lời của nobugz vì không đạt được?Chắc chắn, bạn tiết kiệm một bộ phận và nhân, nhưng bạn giao dịch nó cho một sự phụ thuộc chi nhánh (đó là tồi tệ hơn), và mã mà ít rõ ràng hơn thể hiện ý định của bạn. –

0

Một giải pháp khác, sử dụng phôi:

... 
printf("%.2lf", (double) ((int) (R * 100))/100); 
+0

Điều này không được xác định rõ nếu R có thể âm. –

+0

Tôi đã thử nghiệm trong Borland C++ Builder và nó làm việc cho cả giá trị âm và dương. – Juliano

0

Một cách khác, thực sự ký thuyết bất khả tri: printf ("% d% d \ n"., (Int) r, abs ((int) (r * 100)% 100));

2

Nếu bạn có nó, sử dụng fmod() để cắt đuôi của double:

double rounded = R - fmod(R, 0.01); 
// Now just print rounded with what you were using before 

này có lợi thế là làm việc cùng nếu R là tích cực hay tiêu cực.

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