TÓM LƯỢC:
double roundit(double num, double N)
{
double d = log10(num);
double power;
if (num > 0)
{
d = ceil(d);
power = -(d-N);
}
else
{
d = floor(d);
power = -(d-N);
}
return (int)(num * pow(10.0, power) + 0.5) * pow(10.0, -power);
}
Vì vậy, bạn cần tìm vị trí thập phân của chữ số khác 0 đầu tiên, sau đó lưu N-1 chữ số tiếp theo, sau đó làm tròn chữ số thứ N dựa trên phần còn lại.
Chúng ta có thể sử dụng nhật ký để làm việc đầu tiên.
log 1239451 = 6.09
log 12.1257 = 1.08
log 0.0681 = -1.16
Vì vậy, đối với các số> 0, hãy lấy điểm cuối của nhật ký. Đối với các số <0, lấy tầng của nhật ký.
Bây giờ chúng ta có chữ số d
: 7 trong trường hợp đầu tiên, 2 trong trường hợp thứ 2, -2 trong trường hợp thứ 3.
Chúng ta phải làm tròn (d-N)
chữ số thứ. Cái gì đó như:
double roundedrest = num * pow(10, -(d-N));
pow(1239451, -4) = 123.9451
pow(12.1257, 1) = 121.257
pow(0.0681, 4) = 681
Sau đó, thực hiện điều làm tròn tiêu chuẩn:
roundedrest = (int)(roundedrest + 0.5);
Và hoàn tác các pow.
roundednum = pow(roundedrest, -(power))
Công suất là công suất được tính ở trên.
Về độ chính xác: Câu trả lời của Pyrolistical thực sự gần với kết quả thực hơn. Nhưng lưu ý rằng bạn không thể đại diện chính xác 12.1 trong mọi trường hợp. Nếu bạn in câu trả lời như sau:
System.out.println(new BigDecimal(n));
Câu trả lời là:
Pyro's: 12.0999999999999996447286321199499070644378662109375
Mine: 12.10000000000000142108547152020037174224853515625
Printing 12.1 directly: 12.0999999999999996447286321199499070644378662109375
Vì vậy, hãy sử dụng câu trả lời của Pyro!