double float的精度问题
三部曲
1:
#include <iostream>
#include <stdio.h>
#include <string.h> using namespace std; int main()
{
double a=0.0001;
float b=0.1;
int c=(int)(a*1000)/b;
cout<<c<<endl;
} ///期望c==1 结果c却==0
2:
#include <iostream>
#include <stdio.h>
#include <string.h> using namespace std; int main()
{
double a=0.0001;
float b=0.1;
int c=(int)(a*)/b;
printf("%.15lf\n",b);///实验结果证明 float转成double时出现了精度问题
cout<<a<<endl;
cout<<c<<endl; ///int向上取整 所以==0了
}
3:
#include <iostream>
#include <stdio.h>
#include <string.h> using namespace std; int main()
{
double a=0.0001;
double b=0.1; ///我将float变成double 就OK了
int c=(int)(a*)/b;
printf("%.15lf\n",b);
cout<<a<<endl;
cout<<c<<endl;
}
4::::
double f;
int num =(int) f*100;
结果是:输入f = 1.23, 输出 num = 122.
输入f = 1.25 输出 num =125
这就是著名的double精度损失问题。
因为1.23在计算机里面只能表示为近似值:1.2299999999.........
而1.25却能被精确的表示:
解决的办法是:
int num = (int)(f*100+0.0001),这个0.0001根据你需要的精度来设置,是可以改变的
这时候,不管f=1.23还是f=1.25,结果都是我们想要的123和125.
关键是要理解: 10110101 只是近似等于 1.0110101 * 2^7.
int float double 之间的关系是 int可以隐式转换成double 和float;
float只能强制转换成int 但是可以隐式转换成double;
double只能强制转换成int和float
int与float之间的转换精度会缺失 当int——>float——>int时 两个int已经不相等了
double与float之间的转换精度也会缺失 当double——>float——>double时 两个double不相等了
::::计算机以二进制存储数据 小数的二进制有可能会丢失数据 所以会存在误差 而int型二进制会除尽 不存在误差
double float的精度问题的更多相关文章
- iOS - Json解析精度丢失处理(NSString, Double, Float)
开发中处理处理价格金额问题, 后台经常返回float类型, 打印或转成NSString都会有精度丢失问题, 因此使用系统自带的NSDecimalNumber做处理, 能解决这问题:经过测试其实系统NS ...
- Java中浮点类型的精度问题 double float
要说清楚Java浮点数的取值范围与其精度,必须先了解浮点数的表示方法与浮点数的结构组成.因为机器只认识01,你想表示小数,你要机器认识小数点这个东西,必须采用某种方法.比如,简单点的,float四个字 ...
- java中浮点数的比较(double, float)(转)
问题的提出:如果我们编译运行下面这个程序会看到什么? public static void main(String args[]){ System.out.println(0.05+0.01); Sy ...
- C#中decimal ,double,float的区别
浮点型 Name CTS Type Description Significant Figures Range (approximate) float System.Single 32-bit sin ...
- [转载] c#中decimal ,double,float的区别
一直很奇怪C#的预定义数据类型中为什么加了一个decimal,有float和double不就够了吗?今天来挖一挖. 浮点型 Name CTS Type De script ion Significan ...
- c++ double float 数值比较
浮点数在内存中的存储机制和整型数不同,其有舍入误差,在计算机中用近似表示任意某个实数.具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基 ...
- mysql基础之double,float长度标度定义
MySQL类型float double decimal的区别 float数值类型用于表示单精度浮点数值,而double数值类型用于表示双精度浮点数值,float和double都是浮点型,而decima ...
- impala支持的数据库里的double(float)类型,通过迁移inceptor后,类型的值都变成了null
impala支持的数据库里的double(float)类型,通过迁移inceptor后,double类型的值都变成了null. 通过查阅日志发现默认将double转换成Decimal(38,10)然而 ...
- Java 浮点数精确性探讨(IEEE754 / double / float)与 BigDecimal 解决方案
一.抛砖引玉 一个简单的示例: double a = 0.0; IntStream.range(0,3).foreach(i->a+=0.1); System.out.println(a); / ...
随机推荐
- MVC 第一章(下)
继续第一章 用Javascript and jQuery调用Web API 在上一节,我们用浏览器直接调用web API.但是大多数web API被客户端应用以编程的方式调用.那么我们写一个简单的ja ...
- Luogu 3421 [POI2005]SKO-Knights - Exgcd
Description 给出一个骑士的 $N$种 中行走的方式 $(a_i, b_i)$, 可以使骑士的坐标$(-a,-b)$或$(+a,+b)$. 我们需要找出 第二个骑士的 两种行走方式 $(c_ ...
- libpcap 库使用(二)
参考资料: http://www.tcpdump.org/manpages/pcap.3pcap.html 分类介绍了该lib的函数 Opening a capture handle for read ...
- Maven 下载安装
http://www.runoob.com/maven/maven-tutorial.html https://www.yiibai.com/maven/ Maven 提倡使用一个共同的标准目录结构, ...
- Linux 禁止root 用户登录启用sudo
1.添加sudo用户执行visudo命令,找到: 复制代码 代码如下: root ALL=(ALL) ALL 在下面增加:(注意,qianyunlai 是Linux新增的一个普通用户),没有的话可创建 ...
- c++11 并发 条件变量 超时等待的代码练习
资料地址 http://en.cppreference.com/w/cpp/thread/condition_variable/wait_until http://www.cnblogs.com/ha ...
- Arithmetic Slices II - Subsequence LT446
446. Arithmetic Slices II - Subsequence Hard A sequence of numbers is called arithmetic if it consis ...
- Vue单页面应用
单页面应用指一个系统只加载一次资源,然后下面的操作交互.数据交互是通过router.ajax来进 行,页面并没有刷新:<1>在vue搭建的环境里面怎么有没有公用的css和js? ...
- python+selenium—webdriver入门(一)
一.浏览器最大化 二.设置浏览器分辨率大小 三.打印页面title 四.打印URL 五.控制浏览器前进或后退 #!/usr/bin/env python#-*- coding:utf-8 -*- fr ...
- import this
import this The Zen of Python, by Tim Peters Beautiful is better than ugly. Explicit is better than ...