Tôi có một đơn giản C# chức năng:vấn đề chính xác đúp vào NET
public static double Floor(double value, double step)
{
return Math.Floor(value/step) * step;
}
Đó sẽ tính toán số lượng cao hơn, thấp hơn hoặc bằng "giá trị", đó là bội số của "bước". Nhưng nó thiếu chính xác, như đã thấy trong các bài kiểm tra sau:
[TestMethod()]
public void FloorTest()
{
int decimals = 6;
double value = 5F;
double step = 2F;
double expected = 4F;
double actual = Class.Floor(value, step);
Assert.AreEqual(expected, actual);
value = -11.5F;
step = 1.1F;
expected = -12.1F;
actual = Class.Floor(value, step);
Assert.AreEqual(Math.Round(expected, decimals),Math.Round(actual, decimals));
Assert.AreEqual(expected, actual);
}
Việc đầu tiên và thứ hai khẳng định là ok, nhưng thứ ba thất bại, bởi vì kết quả là chỉ tương đương cho đến khi nơi thập phân thứ 6. Tại sao vậy? Có cách nào để khắc phục điều này?
Cập nhật Nếu tôi gỡ lỗi thử nghiệm, tôi thấy rằng các giá trị bằng nhau cho đến vị trí thập phân thứ 8 thay vì thứ 6, có thể do Math.Round giới thiệu một số sự không chính xác.
Lưu ý Trong mã thử nghiệm, tôi đã viết hậu tố "F" (hằng số nổi rõ ràng), nghĩa là "D" (gấp đôi), vì vậy nếu tôi thay đổi.
nhưng chữ hoa F có nghĩa là gấp đôi, không nổi, phải không? là chữ thường f có nghĩa là phao. –
Không, tôi vừa kiểm tra: float x = 1.0; đưa ra một lỗi, float x = 1.0F; OK. F không phân biệt chữ hoa chữ thường. –
Và nhìn nó trong Ecmea334: 1.0D cho đôi, 1.0M cho thập phân. –