首页 > 其他分享 >关于浮点数误差以及四舍五入

关于浮点数误差以及四舍五入

时间:2023-12-07 15:11:06浏览次数:38  
标签:四舍五入 误差 int double 浮点数 100.0 round 小数

https://blog.csdn.net/Xavier_97/article/details/126931927

由于很玄学,我们考虑统一使用库函数round和自己手写round来实现最终输出整数的四舍五入小数保留k位的四舍五入

#include <iostream>
#include <cmath>
 
using namespace std;
 
int main()
{
  double a = 1.4999999;
  double b = 1.5000001;
  double n_a = -1.4999999;    
  double n_b = -1.5000001; 
  cout << round(a) << endl;    // 1
  cout << round(b) << endl;    // 2
  cout << round(n_a) << endl;    // -1
  cout << round(n_b) << endl;    // -2
  return 0;
}

要得到四舍五入小数点后的结果,我们可以将小数转换为整数来处理,然后再转换为小数。

  • 例如我们需要将1.2345这个数保留小数点后两位四舍五入,我们可以先将其乘以100转换为123.45,然后套用整数的方法来进行四舍五入,再将其除以100转换为小数。
#include <iostream>
 
using namespace std;
 
// 用于四舍五入
int round_0 (double n)
{
  // 若为负数,则先化为正数再进行四舍五入
  if (n > 0)
    return n - int(n) >= 0.5 ? int(n)+1 : int(n);
  else
    return -n - int(-n) >= 0.5 ? -(int(-n) + 1) : -int(-n);
}
 
int main()
{
  double a = 1.2345;
  double b = 1.2355;
  double n_a = -1.2345;
  double n_b = -1.2355;
 
  a = round_0(a * 100.0) / 100.0;
  b = round_0(b * 100.0) / 100.0;
  n_a = round_0(n_a * 100.0) / 100.0;
  n_b = round_0(n_b * 100.0) / 100.0;
 
  cout << a << endl;  // 1.23
  cout << b << endl;  // 1.24
  cout << n_a << endl;  //-1.23
  cout << n_b << endl;  // -1.24
  return 0;
}

标签:四舍五入,误差,int,double,浮点数,100.0,round,小数
From: https://www.cnblogs.com/mathiter/p/17882056.html

相关文章

  • 【C语言基础】float、double 浮点数类型的四舍五入问题
    简短不看版:C语言中,不能进行doublea==doubleb 这样的运算。另外,printf(".1f",&double)的时候,数据输出不同时候,可能会不一样。根本问题时float类型或者double类型的浮点数在计算机中不能精确储存。              单精度浮点型(float)存储方式比如,若我们希......
  • 【C语言】浮点数在内存中的存储
    常⻅的浮点数:3.14159、1E10等,浮点数家族包括:float、double、longdouble类型。 浮点数表⽰的范围:float.h中定义我们先通过一道题目来了解:#include<stdio.h>intmain(){intn=9;float*pFloat=(float*)&n;printf("n的值为:%d\n",n);printf("*pFloat的值为:%f\n",......
  • Java基础——进制,浮点数
    进制二进制:用0,1表示,满2进1。、以0b或者0B开头。八进制用0到7表示,满8进1。以数字0开头。十进制用0到9表示,满10进1十六进制用0到9及A到F表示,此处的A到F不区分大小写,满16进1。以0X或者0x开头。例子如下:inti1=0B10;//二进制0Binti2=010;//八进制0inti3......
  • 【实例】Verilog对数据进行四舍五入(round)与饱和(saturation)截位
    转自https://blog.csdn.net/yan1111112/article/details/118498533重点:1、正数截位:直接看截掉的最高位是不是一,是的话进一。   负数截位:截的最高位为1且其它位不全是0进一2、饱和,也就是大于求的结果,整数变为符号位为0,其它位为1;负数变成第一位为1,其它位为0. 一、引言......
  • verilog实现 floor, round 四舍五入 和 saturation 操作
    floor,round和saturation是进行bit位削减时常用的方法,floor和round用于削减低位,saturation用于削减高位。floor和round的区别在于,floor是将低位直接丢掉,而round则是在丢掉低位前先进行四舍五入。round和saturation的使用范例如下: 假设有一个32bit有符号数a[31:0],其低10bit......
  • C# double decimal 四舍五入
    传送门usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;publicclassProgram{publicstaticvoidMain(){//先看看double类型通过Math.Round取两位小数得到什么Console.WriteLine(Math.Round(2.345d,2));//2.35//再看看de......
  • flotat浮点数类型的误差问题,float a=0.1; 2-a*a*100,和int(2-a*a*100); float的误差问
    来在于洛谷的《深入浅出程序设计竞赛》(基础篇)#include<stdio.h>intmain(){ floata=0.1; printf("%f%f\n",a,a*a); printf("%d\n",int(2-a*a*100)); printf("%.10f",2-a*a*100); return0;}执行结果 原因是这样的,float是浮点数,在执行界面出现的6位小......
  • 【C语言】浮点数取整
    向下取整1. 强制类型转换floatf=1.5;inta;a=(int)f;2.高斯函数doublefloor(doublea)floatf=1.5;inta;a=floor(f);向上取整1.ceil函数doubleceil(doublea)floatf=1.5;inta;a=ceil(f); 2. 强制类型转换+四舍五入floatf=......
  • 浮点数格式: FP64, FP32, FP16, BFLOAT16, TF32
    浮点数格式(参考1,参考2)浮点数是一种用二进制表示的实数,它由三个部分组成:sign(符号位)、exponent(指数位)和fraction(小数位)。不同的浮点数格式有不同的位数分配给这三个部分,从而影响了它们能表示的数值范围和精度。例如: 下面是一些常见的浮点数格式的介绍:FP64(双精度浮点数):用64位......
  • 洛谷B2016 浮点数向零舍入(Python3)
    要点:1.有正有负怎么办?正负分开写?如果只看数字部分,那取整的方式是一样的。所以我们可以先输出符号,把问题全都转化到非负数集中。2.如何取整?此处取整为向下取整。而强制类型转换把浮点数转化为整型数的时候是把小数部分全部去掉,而不是四舍五入,与题中取整方式相符,故可直......