Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
.NET 7

Округление числа без использования Math.Round

29.06.2023, 06:44. Показов 714. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пример исключительно для начинающих с целью "потренировать лапки в написание ненужного кода". Условная демонстрации работы INumber<T>, ну и немного мат-логики. Возможно пригодится кому-то из школьников/студентов/преподавателей для лабораторной или домашки. На реальных проектах конечно нужно использовать Math.Round и не страдать фигней.

Алгоритм довольно прост (вроде):
- сначала генерим два числа соответсвующих 5 и 10 (при условии что у нас тип не обязан реализовывать конвертацию из int, делаем это путем вызова инкремента n-раз в цикле)
- получаем дробную часть путем деления на единицу. Запоминаем целое значение
- генерим множетель на нужное количество разрядов (перемножам 10 N-раз)
- множим дробную часть на множетель для разрядов
- отсекаем дробную часть ещё раз
- для новой дробной части выполняем уножение на 10 и проверяем что результат больше или равен 5. Если это так -- увеличиваем предыдущую дробную часть на +1
- делим первую дробную часть на множитель для разрядов (возращаем изначальный вид дроби)
- прибавляем до целой части

Выглядит всё это безобразие как-то так.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
using System;
using System.Numerics;
 
var _double1 = 0.9d;
Console.WriteLine($"{_double1} ~= {Round(_double1, 0)}");
 
var _double2 = 1.23456789d;
Console.WriteLine($"{_double2} ~= {Round(_double2, 4)}");
 
var _decimal = 9.87654321d;
Console.WriteLine($"{_decimal} ~= {Round(_decimal, 4)}");
 
var _int = 123;
Console.WriteLine($"{_int} ~= {Round(_int, 4)}");
 
Console.ReadKey();
 
T Round<T>(T value, int digits)
    where T : INumber<T>
{
    var five = Init<T>(5);
    var ten = Init<T>(10);
 
    var fraction = value % T.One;
    var result = value - fraction;
    if (fraction == T.Zero)
        return value;
 
    var a = T.One;
    for (var i = 0; i < digits; i++)
        a *= ten;
 
    fraction *= a;
    var afterDigitsFraction = fraction % T.One;
    fraction -= afterDigitsFraction;
 
    if ((afterDigitsFraction *= ten) >= five)
        fraction++;
 
    fraction /= a;
    result += fraction;
 
    return result;
}
 
T Init<T>(int value)
    where T : INumber<T>
{
    var result = T.Zero;
    for(var i = 0; i < value; i++)
        result++;
    return result;
}
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.06.2023, 06:44
Ответы с готовыми решениями:

Округление [Math.Round()]
Почему Math.Round(); при округлении выводит число с E? double a = Math.Round(0.00025, 6); //Вывод: 2,5E-05

Посчитать квадратный корень из числа без использования Math
Привет всем... Я в общем студент... И на первом занятии нам учитель задал задачку... она адресовалась к тем, кто уже знает си шарп.. я к...

Float и метод Math.Ceiling и Math.Round? как округлить float?
Согласно документации Microsoft метод Math.Ceiling и Math.Round не работает с float , а только с double и decimal, не понимаю почему??? как...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.06.2023, 06:44
Помогаю со студенческими работами здесь

Вычислить значение выражения без использования Math.Pow
Помогите исправить программу. Нужно вычислить : Y=1 - x^2/7! + x^4/7! - ... + (-1)^nx^(2n)/7! без Math.Pow ...

Вычислить значение выражения без использования класса Math
Написать программу, вычисляющую значение выражения для заданного числа х без использования класса Math. Для вычисления пользуйтесь рядами...

Написать программу, вычисляющую значение выражения, без использования класса Math
Написать программу, вычисляющую значение выражения для заданного числа х без использования класса Math. Для вычисления использовать ряд...

Math.Round
Пытаюсь округлить получаемое значение...результатов не видно...значение такое же private void button1_Click(object sender, EventArgs e) ...

Math.Round
Здравствуйте! Подскажите, пожалуйста, почему в первом случае выводится ответ 10000000, а во втором 10000002. double a = 10000000.5;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru