首页 > 编程语言 >【C/C++】四舍五入、向上取整、向下取整

【C/C++】四舍五入、向上取整、向下取整

时间:2024-03-08 20:45:55浏览次数:24  
标签:四舍五入 6.000000 自定义 int C++ num 取整 bit

#include <stdio.h>
#include <stdint.h>

double custom_pow(double base, int exponent)
{
    double result = 1.0;

    if(exponent >= 0) {
        for(int i = 0; i < exponent; i++) {
            result *= base;
        }
    } else {
        for(int i = 0; i < -exponent; i++) {
            result /= base;
        }
    }

    return result;
}

/**
 * @brief 向下取整
 *
 * @param bit 精确到第几位
 * @note
 *    custom_floor(1.234, 2) = 1.23
 *    custom_floor(-1.234, 2) = -1.24
 */
double custom_floor(double num, uint8_t bit) {
    int times = custom_pow(10, bit);
    int int_part = (int)(num * times);
    // 检查要求精确位数的后一位是否为0,不为0负数要减一
    if (num < 0 && (int)(num*times*10)/10.0 != int_part) {
        return (double)(int_part - 1) / times;
    } else {
        return (double)int_part / times;
    }
}

/**
 * @brief 向上取整函数
 *
 * @param bit 精确到第几位
 */
double custom_ceil(double num, uint8_t bit)
{
    int times = custom_pow(10, bit);
    int int_part = (int)(num * times);
    // 检查要求精确位数的后一位是否为0,不为0正数要加一
    if (num > 0 && (int)(num*times*10)/10.0 != int_part) {
        return (double)(int_part + 1) / times;
    } else {
        return (double)int_part / times;
    }
}

/**
 * @brief 四舍五入
 *
 * @param bit 精确到第几位
 */
double custom_round(double num, uint8_t bit)
{
    return num < 0 ? custom_ceil(num - 0.5/custom_pow(10, bit), bit) : custom_floor(num + 0.5/custom_pow(10, bit), bit);
}

void test(double num, uint8_t bit)
{
    double result_floor = custom_floor(num, bit);
    printf("自定义向下取整的结果为: %lf\n", result_floor);

    double result_ceil = custom_ceil(num, bit);
    printf("自定义向上取整的结果为: %lf\n", result_ceil);

    double result_round = custom_round(num, bit);
    printf("自定义四舍五入的结果为: %lf\n", result_round);
    printf("%f -------------------------------------------------\n", num);
}

/**
 * @brief 向下取整,精确到整数
 *
 * @param
 * @param
 */
double custom_floor0(double num)
{
    int int_part = (int)num;
    if (num < 0 && num != int_part) {
        return int_part - 1;
    } else {
        return int_part;
    }
}

/**
 * @brief 向上取整,精确到整数
 *
 * @param
 * @param
 */
double custom_ceil0(double num)
{
    int int_part = (int)num;
    if (num > 0 && num != int_part) {
        return int_part + 1;
    } else {
        return int_part;
    }
}

/**
 * @brief 四舍五入,精确到整数
 *
 * @param
 * @param
 */
double custom_round0(double num)
{
    return num < 0 ? custom_ceil0(num - 0.5) : custom_floor0(num + 0.5);
}

void test0(double num)
{
    double result_floor = custom_floor0(num);
    printf("自定义向下取整的结果为: %lf\n", result_floor);

    double result_ceil = custom_ceil0(num);
    printf("自定义向上取整的结果为: %lf\n", result_ceil);

    double result_round = custom_round0(num);
    printf("自定义四舍五入的结果为: %lf\n", result_round);
    printf("%f -------------------------------------------------\n", num);
}


int main(void)
{
    uint8_t bit = 0;
    double num = 6.0;
    test(num, bit);
    
    num = -6.0;
    test(num, bit);
    
    num = 6.0001;
    test0(num);
    test(num, 3);
    
    num = -6.0001;
    test0(num);
    test(num, 3);
    
    num = 6.111;
    test(num, bit);
    
    num = -6.111;
    test(num, bit);
    
    num = 6.888;
    test(num, bit);
    
    num = -6.888;
    test(num, bit);
    
    num = 6.555;
    test(num, bit);
    
    num = -6.555;
    test(num, bit);
    
    num = 6.405;
    test(num, bit);
    
    num = -6.405;
    test(num, bit);

    num = 6.415;
    test(num, bit);
    
    num = -6.415;
    test(num, bit);
    
    num = 6.455;
    test(num, bit);
    
    num = -6.455;
    test(num, bit);
    
    num = 6.465;
    test(num, bit);
    
    num = -6.465;
    test(num, bit);

    return 0;
}

执行结果

自定义向下取整的结果为: 6.000000
自定义向上取整的结果为: 6.000000
自定义四舍五入的结果为: 6.000000
6.000000 -------------------------------------------------
自定义向下取整的结果为: -6.000000
自定义向上取整的结果为: -6.000000
自定义四舍五入的结果为: -6.000000
-6.000000 -------------------------------------------------
自定义向下取整的结果为: 6.000000
自定义向上取整的结果为: 7.000000
自定义四舍五入的结果为: 6.000000
6.000100 -------------------------------------------------
自定义向下取整的结果为: 6.000000
自定义向上取整的结果为: 6.000000
自定义四舍五入的结果为: 6.000000
6.000100 -------------------------------------------------
自定义向下取整的结果为: -7.000000
自定义向上取整的结果为: -6.000000
自定义四舍五入的结果为: -6.000000
-6.000100 -------------------------------------------------
自定义向下取整的结果为: -6.000000
自定义向上取整的结果为: -6.000000
自定义四舍五入的结果为: -6.000000
-6.000100 -------------------------------------------------
自定义向下取整的结果为: 6.000000
自定义向上取整的结果为: 7.000000
自定义四舍五入的结果为: 6.000000
6.111000 -------------------------------------------------
自定义向下取整的结果为: -7.000000
自定义向上取整的结果为: -6.000000
自定义四舍五入的结果为: -6.000000
-6.111000 -------------------------------------------------
自定义向下取整的结果为: 6.000000
自定义向上取整的结果为: 7.000000
自定义四舍五入的结果为: 7.000000
6.888000 -------------------------------------------------
自定义向下取整的结果为: -7.000000
自定义向上取整的结果为: -6.000000
自定义四舍五入的结果为: -7.000000
-6.888000 -------------------------------------------------
自定义向下取整的结果为: 6.000000
自定义向上取整的结果为: 7.000000
自定义四舍五入的结果为: 7.000000
6.555000 -------------------------------------------------
自定义向下取整的结果为: -7.000000
自定义向上取整的结果为: -6.000000
自定义四舍五入的结果为: -7.000000
-6.555000 -------------------------------------------------
自定义向下取整的结果为: 6.000000
自定义向上取整的结果为: 7.000000
自定义四舍五入的结果为: 6.000000
6.405000 -------------------------------------------------
自定义向下取整的结果为: -7.000000
自定义向上取整的结果为: -6.000000
自定义四舍五入的结果为: -6.000000
-6.405000 -------------------------------------------------
自定义向下取整的结果为: 6.000000
自定义向上取整的结果为: 7.000000
自定义四舍五入的结果为: 6.000000
6.415000 -------------------------------------------------
自定义向下取整的结果为: -7.000000
自定义向上取整的结果为: -6.000000
自定义四舍五入的结果为: -6.000000
-6.415000 -------------------------------------------------
自定义向下取整的结果为: 6.000000
自定义向上取整的结果为: 7.000000
自定义四舍五入的结果为: 6.000000
6.455000 -------------------------------------------------
自定义向下取整的结果为: -7.000000
自定义向上取整的结果为: -6.000000
自定义四舍五入的结果为: -6.000000
-6.455000 -------------------------------------------------
自定义向下取整的结果为: 6.000000
自定义向上取整的结果为: 7.000000
自定义四舍五入的结果为: 6.000000
6.465000 -------------------------------------------------
自定义向下取整的结果为: -7.000000
自定义向上取整的结果为: -6.000000
自定义四舍五入的结果为: -6.000000
-6.465000 -------------------------------------------------

 

标签:四舍五入,6.000000,自定义,int,C++,num,取整,bit
From: https://www.cnblogs.com/skullboyer/p/18061812

相关文章

  • C++习题
    打印菱形 #include<iostream>usingnamespacestd;intmain(){cout<<"*"<<endl;cout<<"***"<<endl;cout<<"*"<<endl;return0;} 进制转换#include<iostream>#include<iomanip&g......
  • c++小知识(2)
    一、引用和指针的区别:指针:从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。引用:是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对......
  • C++ Qt开发:QFileSystemWatcher文件监视组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QFileSystemWatcher组件实现对文件或目录的监视功能。QFileSystemWatcher是Qt框架中......
  • C/C++结构体最详细的讲解
    转载自知乎:https://zhuanlan.zhihu.com/p/6117720311.定义结构体法一(推荐,写法简单)structStudent{stringm_Name;intm_Age;Student()=default;Student(stringname,intage):m_Name(name),age(m_Age){}};一般定义结构体和类时,如果不写关于构造函数的任何东西,结构......
  • c++多线程
    1.线程库的使用创建进程#include<iostream>#include<thread>//线程库头文件usingnamespacestd;voidthread_1(){cout<<"子线程1"<<endl;}intthread_2(intx){cout<<"子线程2"<<endl;returnx;}intm......
  • C++中的static关键字
    在C++中,static是一个关键字,用于声明静态变量、静态函数、静态类成员以及静态局部变量。static关键字的作用取决于它所修饰的上下文,以下是static关键字的几种常见用法:静态变量:在函数内部使用static关键字声明的变量称为静态局部变量。静态局部变量的生命周期延长到整个程......
  • JavaScript 常用取整、四舍五入方法汇总
    https://juejin.cn/post/7184257661339172919  2023-01-0314,624阅读2分钟 在JavaScript中,对数值进行四舍五入操作的场景有以下几种:向上取整:ceil向下取整:floor四舍五入:round固定精度:toFixed固定长度:toPrecision取整:parseInt1.向上取整:ceilceil是天花板......
  • C++中OpenCV、Armadillo矩阵数据格式的转换方式
      本文介绍在C++语言中,矩阵库Armadillo的mat、vec格式数据与计算机视觉库OpenCV的Mat格式数据相互转换的方法。  在C++语言的矩阵库Armadillo与计算机视觉库OpenCV中,都有矩阵格式的数据类型;而这两个库在运行能力方面各有千秋,因此实际应用过程中,难免会遇到需要将二者的矩阵格......
  • C++中的volatile关键字
    在C++中,volatile是一个关键字,用于告诉编译器,该变量的值可能会在未知的时刻被意外地改变,因此编译器对于该修饰的变量的操作时应该保持对该变量内存地址的直接内存访问操作,而不应对访问该变量的代码进行任何优化。。volatile关键字的主要作用是告诉编译器不要对该变量进行优化,......
  • C++ Qt开发:QFileSystemModel文件管理组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QFileSystemModel组件实现文件管理器功能。QFileSystemModel是Qt框架中的一个关键类,用于......