如何指定一个double数字的c 去小数点后指定位数保留位数

输入一个double类型的数,使该小数保留小数点后两位
按%.2f输出
为您推荐:
其他类似问题
扫描下载二维码double型数据如何四舍五入精确保留小数点后若干位?
40north00]
double型数据如何四舍五入精确保留小数点后若干位?
40north00]
发布时间: 3:43:01
编辑:www.fx114.net
本篇文章主要介绍了"double型数据如何四舍五入精确保留小数点后若干位?
40north00]",主要涉及到double型数据如何四舍五入精确保留小数点后若干位?
40north00]方面的内容,对于double型数据如何四舍五入精确保留小数点后若干位?
40north00]感兴趣的同学可以参考一下。
double&a,b,c;
c=a/b;&&&/*理论上是0.无穷循环下去的*/
现在想知道C的标准库里是否有四舍五入精确保留小数点后若干位的函数?譬如将c保留到小数点后15位?
谢谢。。。好像没有,但是如果你想获得几位小数的话那你就取小数点后面的几位同求,这个问题我也想问这样操作会数据失真。
有没有什么办法可以四舍五入获取的呢?
引用&1&楼&&的回复:好像没有,但是如果你想获得几位小数的话那你就取小数点后面的几位引用楼主&&的回复:例如:
double&a,b,c;
c=a/b;&&&/*理论上是0.无穷循环下去的*/
现在想知道C的标准库里是否有四舍五入精确保留小数点后若干位的函数?譬如将c保留到小数点后15位?
谢谢。。。
15位应该是不可能的。15位应该是不可能的。#include&&stdio.h&
int&main&(void)
double&a,b,c;
&&&&c=a/b;
&&&&printf("%.15f",&c);&
}该回复于 09:11:12被版主删除printf是打印出来的格式,我要的是四舍五入后保存到变量中得,谢谢。
引用&6&楼&&的回复:#include&&stdio.h&
int&main&(void)
double&a,b,c;
&&printf("%.15f",&c);&
}没有标准的函数,除非你自己写我觉得动不动就说“浮点数不精确有精度损失”的同学,大多数都没弄懂什么叫精度
double的精度是15~16位,就是说前14位都是精确的
如果你觉得不够精确,那你需要自己定义一个数据类型,以及和它相关的所有操作如果有人觉得一个理论上是1的数,1.001比0.9999精确,那这个人应该趁早转行
并且别转任何需要理解精度这个概念的理工科引用&10&楼&&的回复:我觉得动不动就说“浮点数不精确有精度损失”的同学,大多数都没弄懂什么叫精度
double的精度是15~16位,就是说前14位都是精确的
如果你觉得不够精确,那你需要自己定义一个数据类型,以及和它相关的所有操作
0.2&+&0.3&!=&0.5虚心接受高人教诲;
那我请教一下,在C里面默认的一般double型相加减乘除会自己保留多少位呢?譬如2.0/3.0??
我问的目的是因为在其他语言里,这样的数据多次操作后如果不做四舍五入的话会从负的变成正的,或者从正的变成负的,符号性质变了问题就大了。
引用&10&楼&&的回复:我觉得动不动就说“浮点数不精确有精度损失”的同学,大多数都没弄懂什么叫精度
double的精度是15~16位,就是说前14位都是精确的
如果你觉得不够精确,那你需要自己定义一个数据类型,以及和它相关的所有操作引用&13&楼&&的回复:虚心接受高人教诲;
那我请教一下,在C里面默认的一般double型相加减乘除会自己保留多少位呢?譬如2.0/3.0??
我问的目的是因为在其他语言里,这样的数据多次操作后如果不做四舍五入的话会从负的变成正的,或者从正的变成负的,符号性质变了问题就大了。
说过了double型数据前14位有效数字都是精确的
保留多少位?那种人类笔算数学题的东西,和计算机没关系
假如你的数据是纯小数,那么double型数据的精度就到小数点后15~16位,如果你的数据本身就大于10的16次方,那么它根本精确不到小数点后
2.0/3.0的结果就是0.66+[0,0.00001],精确到第十四个有效数字,后面的不确定整型数据具有最高精度,其它类型都有精度损失您可能没理解我的意思。
我知道您在前面描述过了double型前14位都是精确的;
我是C新手,问您的问题是:假设在C里面2.0/3.0计算后产生了15位小数(具体计算后产生多少位我不清楚),那么因为前14位是精确的,我怎么去四舍五入保留前14位的数据。
谢谢~~~~~~~~~~~~~~~~~~~
引用&14&楼&&的回复:引用&13&楼&&的回复:
虚心接受高人教诲;
那我请教一下,在C里面默认的一般double型相加减乘除会自己保留多少位呢?譬如2.0/3.0??
我问的目的是因为在其他语言里,这样的数据多次操作后如果不做四舍五入的话会从负的变成正的,或者从正的变成负的,符号性质变了问题就大了。
说过了double型数据前14位有效数字都是精确的
保留多少位?那种人类笔算数学题的东西,和计算机……引用&16&楼&&的回复:您可能没理解我的意思。
我知道您在前面描述过了double型前14位都是精确的;
我是C新手,问您的问题是:假设在C里面2.0/3.0计算后产生了15位小数(具体计算后产生多少位我不清楚),那么因为前14位是精确的,我怎么去四舍五入保留前14位的数据。
如果要对小数点后3位四舍五入,就乘以1000,加0.5,强制转换int向下取整(如果没超范围的话,如果超范围就换long,如果连longlong都不行就自己写字符串处理函数吧),除以1000
double&a&=&2.0/3.0;
a&*=&1000;
int&b&=&(&int&)(&a&+&0.5&);
a&=&b&/&1000.0;double强制转int是取绝对值整数部分
所以如果要四舍五入的是负数,那就不是加0.5而是减0.5
没了我试了一下您的代码:
double&a&=&2.0/3.0;
a&*=&pow(10,8);
long&b&=&(&int&)(&a&+&0.5&);
a&=&b&/&pow(10,8);
断点后得到a的最终结果是a=0.000002&???
为什么a的最后一个小数不是0?引用&19&楼&&的回复:我试了一下您的代码:
double&a&=&2.0/3.0;
a&*=&pow(10,8);
long&b&=&(&int&)(&a&+&0.5&);
a&=&b&/&pow(10,8);
断点后得到a的最终结果是a=0.000002&???
为什么a的最后一个小数不是0?
你还是不知道什么叫精度
误差在一定范围内,这就叫精度
这个2位于第18位,已经超出了double能够精确表示的位数,它是2是9是0是5完全不确定
如果非要任意小数四舍五入后指定位以后全部是0,自己写一套用字符串代表任意小数进行数学运算的函数吧先用sprintf打包,然后再转回来。就好了。浮点数能够精确表示的小数,仅限于“化为分数后分母为2的次方”的有理数
2.0/3.0分母是3,不是2的次方,它不可能用浮点数精确表示
在某一位四舍五入再化为分数后是否是2的次方,这是不能保证的事情,也许你可以去摸索一下这个规律
在现实中除了“尺度的定义”本身,没有任何度量是精确的
保证误差在某个小范围内,这就叫精度引用&17&楼&&的回复:引用&16&楼&的回复:
您可能没理解我的意思。
我知道您在前面描述过了double型前14位都是精确的;
我是C新手,问您的问题是:假设在C里面2.0/3.0计算后产生了15位小数(具体计算后产生多少位我不清楚),那么因为前14位是精确的,我怎么去四舍五入保留前14位的数据。
如果要对小数点后3位四舍五入,就乘以1000,加0.5,强制转换int向下取整(如果没超范围……
楼主是要问有没有实现double型数据,保留n位的算法,貌似不应该认为保留五位小数,就对第六位四舍五入,那如果是这个数应该如何:1.,小数点后保留五位有效数字,难结果是1.12345?应该是1.12346是不是...
本文标题:
本页链接:【已解决】C#中将double变量格式化为字符串,且保留小数点后面的全部位数
C#中已经获得一个double变量值,比如5.6758,然后想要将其转换为字符串,且保留全部的小数点后的4位,但是结果却是:
private void doubleToStringTest()
double curMilliSecDouble = 5.6758;
//double curMilliSecDouble = crl.getCurTimeInMillisec();
string curMilliSecStrF = curMilliSecDouble.ToString(&%.4f&);
string curMilliSecStrG = curMilliSecDouble.ToString(&G&);
string curMilliSecStrG4 = curMilliSecDouble.ToString(&G4&);
//1.343E+12
string curMilliSecStr00 = curMilliSecDouble.ToString(&0.0000&); //9.0700
string curMilliSecStrF6 = curMilliSecDouble.ToString(&f6&);
//5.680000
string curMilliSecStr = curMilliSecDouble.ToString();
始终都不能显示出4位的小数。
【解决过程】
1.找到了,但是没啥帮助。
2.后来好不容易找到了微软官方教程:,并写出了上述测试代码,但是始终还是只是输出小数点后2位。
3.网上这人也遇到了类似问题:
但是没人解释的清楚.
4.而这个解释:也不是我所需要的.
5.参考去用Math.Round:
string roundedDoubleStr = Math.Round(curMilliSecDouble, 4).ToString();
结果输出还是5.68,而不是所希望的5.6758
6.参考去试了是#:
string curMilliSecStrXing = curMilliSecDouble.ToString(&#.####&); //5.68
结果问题依旧。
7.后来参考:,看到其提示说,根本不是小数点后面几位的问题,而是总位数的问题.
然后可以看出,对于:5.6758
其共17位数字,整数部分13位,小数部分4位
然后就去故意测试少一位的情况,比如:
此double值,其共16位数字,整数部分12位,小数部分4位
然后测试结果就是可以再多输出一位小数的:
double less1BitDouble = .6758;
string less1BitDoubleStrG = less1BitDouble.ToString(&G&);
string less1BitDoubleStrF = less1BitDouble.ToString(&F&);
string less1BitDoubleStrF6 = less1BitDouble.ToString(&F6&); //&.676000&
后来又去试了试用更小一点的double值去测试:
double smallValDouble = ;
string smallValDoubleStrG = smallValDouble.ToString(&G&);
string smallValDoubleStrF = smallValDouble.ToString(&F&);
string smallValDoubleStrF6 = smallValDouble.ToString(&F6&); //
结果很明显,是可以安装所期望的正常输出的:
F:默认是2位小数点
F6:输出小数点后6位,不够的话用0补齐
G:默认输出原先的,保留小数点后面的位数(对于double默认是最多15个,详见:)。
此处像5.6758一样的double值,不论去用ToString格式化输出,不论参数是F还是G,还是FN或GN,结果都还是2位的小数点,其原因在此double值太大了,总的位数,正好是13+4=17,而实际上内部最多只能存15位,所以实际上小数点后面只有2位,所以输出的时候,始终只能输出2位,正巧和F参数默认输出2位所吻合,所以以为F和G等参数没有实际生效呢。
共享此文章:
, , , , , , ,
免费的格式化Javascript源码的网站
查询Unicode字符,且还带Oct,Decimal,Hex,HTML Entity
HTML和Javascript都支持,很好用。2009年9月 Java大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。}

我要回帖

更多关于 计算器小数点保留位数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信