Как округлить число до следующего числа по десятичному знаку?

Вот мой предварительный результат:

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

Итак, вы хотите округлить до одной ненулевой десятичной цифры? В IEEE754 FP вы должны получить это по умолчанию, если правильно укажете формат печати. Чтобы сделать это вручную, преобразуйте число в строку, а затем примените правила, описанные в разделе методы округления — округляйте половину до четного, также называемого банкирским округлением. Доступны и другие правила округления (их много).

Martin Brown 09.05.2024 12:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
67
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вот моя попытка:

var round = Math.Ceiling(input / 10);
var result = input < 1 ?                  
        (Math.Ceiling((input * 10)) / 10) :  
            round < 10   
            ? Math.Ceiling((input /10) * 10) 
            : round * 10;

.Net-рабочий пример


Объяснение:

Для чисел меньше 1:

  • Умножьте число на 10, а затем используйте 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

Другие вопросы по теме