c++如何将double类型四舍五入保留两位小数,要精确的保留

huhuint 2014-09-06 01:41:27
最近才发现printf("%.2f",a)并不能保证总数准确的保留两位小数
例如double a=37.975,则输出37.97,而不是37.98

请问怎么才能实现四舍五入的输出,谢谢
...全文
55763 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
大聪 2017-03-21
  • 打赏
  • 举报
回复
#include <iostream> #include <sstream> #include <iomanip> using namespace std; double round(double number, unsigned int bits) { stringstream ss; ss << fixed << setprecision(bits) << number; ss >> number; return number; } int main() { double number = 3.1415926535897932; cout << fixed << showpoint << setprecision(15); cout << "一开始number = " << number << endl; for (int i = 0; i < 15; ++i) { cout << "number保留" << i << "位小数后为: " << round(number, i) << endl; } return 0; }
mujiok2003 2014-09-09
  • 打赏
  • 举报
回复
使用round函数试试

#include <stdio.h>
#include <math.h>

int main(void) {
    printf("%.2f",round(37.975*1e3)/1e3);
    return 0;
}


mujiok2003 2014-09-09
  • 打赏
  • 举报
回复
what's your compiler?
赵4老师 2014-09-09
  • 打赏
  • 举报
回复
//Round(1.234,2) = 1.23
//Round(1.234,0) = 1.0
//Round(123.4,-1) = 120.0
double Round(double dVal, short iPlaces) {
    double dRetval;
    double dMod = 0.0000001;
    if (dVal<0.0) dMod=-0.0000001;
    dRetval=dVal;
    dRetval+=(5.0/pow(10.0,iPlaces+1.0));
    dRetval*=pow(10.0,iPlaces);
    dRetval=floor(dRetval+dMod);
    dRetval/=pow(10.0,iPlaces);
    return(dRetval);
}

double round(double dVal, short iPlaces) //iPlaces>=0
{
    unsigned char s[20];
    double dRetval;

    sprintf(s,"%.*lf",iPlaces,dVal);
    sscanf(s,"%lf",&dRetval);
    return (dRetval);
}
huhuint 2014-09-09
  • 打赏
  • 举报
回复
引用 18 楼 Baoge_leopard 的回复:
[quote=引用 16 楼 huhuint 的回复:] [quote=引用 15 楼 Baoge_leopard 的回复:]
#include <stdio.h>
#include <math.h>
double round(double r)
{
    return (r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5);
}
int main(void) 
{
    printf("%.2f",round(37.975*1e3)/1e3);
    return 0;
}
2.1 2.6 -2.1 -2.6 floor : 不大于自变量的最大整数 2 2 -3 -3 ceil :不小于自变量的最大整数 3 3 -2 -2 round:四舍五入到最邻近的整数 2 3 -2 -3 floor(),ceil() 需包含头文件<math.h> C++中没有直接的round函数 需自己建立 double round(double r) { return (r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5); }
不应该自带round函数吗?可以查到啊? 那自带的round函数怎么用?[/quote] 我也没查到,你在哪找到的[/quote] 百度,嘿嘿
默伊清风 2014-09-09
  • 打赏
  • 举报
回复
引用 16 楼 huhuint 的回复:
[quote=引用 15 楼 Baoge_leopard 的回复:]
#include <stdio.h>
#include <math.h>
double round(double r)
{
    return (r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5);
}
int main(void) 
{
    printf("%.2f",round(37.975*1e3)/1e3);
    return 0;
}
2.1 2.6 -2.1 -2.6 floor : 不大于自变量的最大整数 2 2 -3 -3 ceil :不小于自变量的最大整数 3 3 -2 -2 round:四舍五入到最邻近的整数 2 3 -2 -3 floor(),ceil() 需包含头文件<math.h> C++中没有直接的round函数 需自己建立 double round(double r) { return (r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5); }
不应该自带round函数吗?可以查到啊? 那自带的round函数怎么用?[/quote] 我也没查到,你在哪找到的
huhuint 2014-09-09
  • 打赏
  • 举报
回复 1
引用 13 楼 jianwen0529 的回复:
[quote=引用 10 楼 huhuint 的回复:] [quote=引用 4 楼 zhao4zhong1 的回复:]
//Round(1.234,2) = 1.23
//Round(1.234,0) = 1.0
//Round(123.4,-1) = 120.0
double Round(double dVal, short iPlaces) {
    double dRetval;
    double dMod = 0.0000001;
    if (dVal<0.0) dMod=-0.0000001;
    dRetval=dVal;
    dRetval+=(5.0/pow(10.0,iPlaces+1.0));
    dRetval*=pow(10.0,iPlaces);
    dRetval=floor(dRetval+dMod);
    dRetval/=pow(10.0,iPlaces);
    return(dRetval);
}

double round(double dVal, short iPlaces) //iPlaces>=0
{
    unsigned char s[20];
    double dRetval;

    sprintf(s,"%.*lf",iPlaces,dVal);
    sscanf(s,"%lf",&dRetval);
    return (dRetval);
}
老师,你这个原理就是+0.005呗? 我还想问下,我include<math.h>,咋说,round是未声明的标识符,前提是没自己写round函数。 老师,我还有个问题,我#include<stdio>总是报错,无法打开源文件,#include<stdio.h>就解决了,想了解下 原因 谢谢老师啦[/quote] cstdio C++库文件风格 stdio.h 这是C原本的样式[/quote] 哦 了解了
huhuint 2014-09-09
  • 打赏
  • 举报
回复
引用 15 楼 Baoge_leopard 的回复:
#include <stdio.h>
#include <math.h>
double round(double r)
{
    return (r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5);
}
int main(void) 
{
    printf("%.2f",round(37.975*1e3)/1e3);
    return 0;
}
2.1 2.6 -2.1 -2.6 floor : 不大于自变量的最大整数 2 2 -3 -3 ceil :不小于自变量的最大整数 3 3 -2 -2 round:四舍五入到最邻近的整数 2 3 -2 -3 floor(),ceil() 需包含头文件<math.h> C++中没有直接的round函数 需自己建立 double round(double r) { return (r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5); }
不应该自带round函数吗?可以查到啊? 那自带的round函数怎么用?
默伊清风 2014-09-09
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <math.h>
double round(double r)
{
    return (r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5);
}
int main(void) 
{
    printf("%.2f",round(37.975*1e3)/1e3);
    return 0;
}
2.1 2.6 -2.1 -2.6 floor : 不大于自变量的最大整数 2 2 -3 -3 ceil :不小于自变量的最大整数 3 3 -2 -2 round:四舍五入到最邻近的整数 2 3 -2 -3 floor(),ceil() 需包含头文件<math.h> C++中没有直接的round函数 需自己建立 double round(double r) { return (r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5); }
默伊清风 2014-09-09
  • 打赏
  • 举报
回复
#include <stdio.h> #include <math.h> double round(double r) { return (r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5); } int main(void) { printf("%.2f",round(37.975*1e3)/1e3); return 0; }
幻夢之葉 2014-09-09
  • 打赏
  • 举报
回复
引用 10 楼 huhuint 的回复:
[quote=引用 4 楼 zhao4zhong1 的回复:]
//Round(1.234,2) = 1.23
//Round(1.234,0) = 1.0
//Round(123.4,-1) = 120.0
double Round(double dVal, short iPlaces) {
    double dRetval;
    double dMod = 0.0000001;
    if (dVal<0.0) dMod=-0.0000001;
    dRetval=dVal;
    dRetval+=(5.0/pow(10.0,iPlaces+1.0));
    dRetval*=pow(10.0,iPlaces);
    dRetval=floor(dRetval+dMod);
    dRetval/=pow(10.0,iPlaces);
    return(dRetval);
}

double round(double dVal, short iPlaces) //iPlaces>=0
{
    unsigned char s[20];
    double dRetval;

    sprintf(s,"%.*lf",iPlaces,dVal);
    sscanf(s,"%lf",&dRetval);
    return (dRetval);
}
老师,你这个原理就是+0.005呗? 我还想问下,我include<math.h>,咋说,round是未声明的标识符,前提是没自己写round函数。 老师,我还有个问题,我#include<stdio>总是报错,无法打开源文件,#include<stdio.h>就解决了,想了解下 原因 谢谢老师啦[/quote] cstdio C++库文件风格 stdio.h 这是C原本的样式
赵4老师 2014-09-09
  • 打赏
  • 举报
回复
Round的原理是+0.5 round不是。
  • 打赏
  • 举报
回复
大嘴的代码写得太拙劣... 来一个好一点的:

double RoundTo(double N, int Digit)
{
  if ((Digit < -37) || (Digit > 37))
    return N;
  double Factor = pow(10.0, Digit);
  if (N < 0)
    return floor(N / Factor - 0.5) * Factor;
  else
    return floor(N / Factor + 0.5) * Factor;
}
用法和大嘴的代码一样。
huhuint 2014-09-09
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
//Round(1.234,2) = 1.23
//Round(1.234,0) = 1.0
//Round(123.4,-1) = 120.0
double Round(double dVal, short iPlaces) {
    double dRetval;
    double dMod = 0.0000001;
    if (dVal<0.0) dMod=-0.0000001;
    dRetval=dVal;
    dRetval+=(5.0/pow(10.0,iPlaces+1.0));
    dRetval*=pow(10.0,iPlaces);
    dRetval=floor(dRetval+dMod);
    dRetval/=pow(10.0,iPlaces);
    return(dRetval);
}

double round(double dVal, short iPlaces) //iPlaces>=0
{
    unsigned char s[20];
    double dRetval;

    sprintf(s,"%.*lf",iPlaces,dVal);
    sscanf(s,"%lf",&dRetval);
    return (dRetval);
}
老师,你这个原理就是+0.005呗? 我还想问下,我include<math.h>,咋说,round是未声明的标识符,前提是没自己写round函数。 老师,我还有个问题,我#include<stdio>总是报错,无法打开源文件,#include<stdio.h>就解决了,想了解下 原因 谢谢老师啦
赵4老师 2014-09-09
  • 打赏
  • 举报
回复
shiguojie19892 2014-09-09
  • 打赏
  • 举报
回复
转换成字符,自己判断,然后再返回值
qq120848369 2014-09-09
  • 打赏
  • 举报
回复
浮点数就不要指望精确,用大数库试试。
lm_whales 2014-09-08
  • 打赏
  • 举报
回复
不能完全保证 不过流输出,大致是四舍五入的
熊熊大叔 2014-09-06
  • 打赏
  • 举报
回复
a+0.005
阿呆_ 2014-09-06
  • 打赏
  • 举报
回复
a+0.0049

65,182

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧