Tôi đang cố gắng làm tròn số tới số thập phân đầu tiên và xem xét các tùy chọn MidpointRounding khác nhau, có vẻ như hoạt động tốt. Một vấn đề nảy sinh khi số đó có số thập phân tiếp theo sẽ ảnh hưởng không cân bằng đến làm tròn.Có cách nào để làm 'chính xác' làm tròn số học trong .NET không?/C#
Một ví dụ:
Với 0.1
, 0.11..0.19
và 0.141..0.44
nó hoạt động:
Math.Round(0.1, 1) == 0.1
Math.Round(0.11, 1) == 0.1
Math.Round(0.14, 1) == 0.1
Math.Round(0.15, 1) == 0.2
Math.Round(0.141, 1) == 0.1
Nhưng với 0.141..0.149
nó luôn luôn trả 0.1
, mặc dù 0.146..0.149
tròn nên để 0.2
:
Math.Round(0.145, 1, MidpointRounding.AwayFromZero) == 0.1
Math.Round(0.146, 1, MidpointRounding.AwayFromZero) == 0.1
Math.Round(0.146, 1, MidpointRounding.ToEven) == 0.1
Math.Round(0.146M, 1, MidpointRounding.ToEven) == 0.1M
Math.Round(0.146M, 1, MidpointRounding.AwayFromZero) == 0.1M
tôi cố gắng tìm ra một dấu chấm câu ion giải quyết vấn đề này, và nó hoạt động tốt cho trường hợp này, nhưng tất nhiên nó không thành công nếu bạn cố gắng làm tròn tức là 0.144449
đến chữ số thập phân đầu tiên (phải là 0.2
, nhưng kết quả là 0.1
.) Math.round() một trong hai.)
private double "round"(double value, int digit)
{
// basically the old "add 0.5, then truncate to integer" trick
double fix = 0.5D/(Math.Pow(10D, digit+1))*(value >= 0 ? 1D : -1D);
double fixedValue = value + fix;
// 'truncate to integer' - shift left, round, shift right
return Math.Round(fixedValue * Math.Pow(10D, digit))/Math.Pow(10D, digit);
}
tôi giả sử một giải pháp sẽ được liệt kê tất cả chữ số, tìm giá trị đầu tiên lớn hơn 4 và sau đó vòng lên, nếu không làm tròn xuống. Vấn đề 1: Điều đó có vẻ ngu ngốc, Bài 2: Tôi không biết cách liệt kê các chữ số mà không có một gazillion phép nhân và phép trừ.
Câu chuyện dài: Cách tốt nhất để làm điều đó là gì?
lý do tại sao nên 0.149 vòng đến 0,2 nó nhỏ hơn điểm giữa nên nó không được làm tròn lên. bạn có thực sự muốn cắt bớt và thêm 1 có thể không? –