Вот мой предварительный результат:
396.6 -> 400
39.66 -> 40
3.96 -> 4
0.396 -> 0.4
Как я могу сделать это на С#? Вот моя попытка:
public static double CeilToNextSameDecimal(double number)
{
int decimalPlaces = BitConverter.GetBytes(decimal.GetBits((decimal)number)[3])[2];
double factor = Math.Pow(10, decimalPlaces);
return Math.Ceiling(number * factor) / factor;
}
Но дайте мне неправильные результаты (т.е. тот же ввод):
396.6
39.66
3.966
0.3966
Вот моя попытка:
var round = Math.Ceiling(input / 10);
var result = input < 1 ?
(Math.Ceiling((input * 10)) / 10) :
round < 10
? Math.Ceiling((input /10) * 10)
: round * 10;
Объяснение:
Для чисел меньше 1:
Math.Ceil()
, чтобы преобразовать число в большее число, а затем разделите его.Для отдыха:
Math.Ceil()
, если оно меньше 10, то Math.Ceiling((input /10) * 10)
в противном случае Math.Ceiling(input / 10) * 10
Ваш метод запроса десятичного числа дает вам количество десятичных знаков. Однако нас интересует количество цифр перед десятичной дробью.
Итак, мы ищем что-то вроде следующего, что является двоюродным братом вашей попытки.
public static double CeilToNextSameDecimal(double number)
{
var digitsBeforeDecimals = Math.Ceiling(Math.Log10(number));
double factor = Math.Pow(10, digitsBeforeDecimals - 1);
return Math.Ceiling(number / factor) * factor;
}
Результаты в
120.6 -> 200
39.66 -> 40
3.966 -> 4
0.01 -> 0.01
Итак, вы хотите округлить до одной ненулевой десятичной цифры? В IEEE754 FP вы должны получить это по умолчанию, если правильно укажете формат печати. Чтобы сделать это вручную, преобразуйте число в строку, а затем примените правила, описанные в разделе методы округления — округляйте половину до четного, также называемого банкирским округлением. Доступны и другие правила округления (их много).