C++里面 为什么 0.1+0.2-0.3不等于0 而等于一个很接近0的小数?

如题所述

因为c++语言 直接 用计算机标准的表示小数的方式(IEEE浮点数格式)表示和保存小数,而这个方式保存0.1 0.2 0.3都是不能像用纸笔写0.1那样“准确”表示的。

int cmp(const void* a, const void* b)。如果返回负数,说明a排在b前面。如果返回正数,说明a排在b后面。如果返回0,说明a和b无先后关系但比如0.5 0.25 0.125等数字,它们是可以准确地用c++直接表示的。



扩展资料:

在C++中,类是支持数据封装的工具,对象则是数据封装的实现。C++通过建立用户定义类支持数据封装和数据隐藏。

在面向对象的程序设计中,将数据和对该数据进行合法操作的函数封装在一起作为一个类的定义。对象被说明为具有一个给定类的变量。每个给定类的对象包含这个类所规定的若干私有成员、公有成员及保护成员。

完好定义的类一旦建立,就可看成完全封装的实体,可以作为一个整体单元使用。类的实际内部工作隐藏起来,使用完好定义的类的用户不需要知道类是如何工作的,只要知道如何使用它即可。

参考资料来源:百度百科-C++

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-11-25
因为c++语言 直接 用计算机标准的表示小数的方式(IEEE浮点数格式)表示和保存小数,而这个方式保存0.1 0.2 0.3都是不能像我们用纸笔写0.1那样“准确”表示的,它只能尽可能地接近地表示,我们如果要较真,那么c++表示的0.1 0.2 0.3都不是等于我们日常算术计算的0.1 0.2 0.3的值的,它们在正确值上下浮动。

但比如0.5 0.25 0.125等数字,它们是可以准确地用c++直接表示的。
凡 可以表示成 A*(2的幂), A是整数,(结果不要太大或太小或有效位数太多哦)的数都可以准确地用C++或计算机直接表示,比如0.5 = 1*2^-1 0.25=1*2^-2 0.75=3*2^-2本回答被提问者采纳
第2个回答  2012-09-01
计算机处理十进制数是需要先变成二进制数表示的,0.1,0.2,0.3这类的数变成二进制就是个无限位小数,总会存在一定的误差。就好像用十进制写三分之一一样
第3个回答  2012-09-01
一句话,计算机中数字的近似度与我们日常中使用的不同,所以对计算机的数据类型要更加细心的使用,要注意他们的区别,最好是看这方面的书,避免片面。
第4个回答  2012-09-01
这是IEEE浮点数算法的误差问题,所有用这个算法的语言都有这个问题(比如c,javascript).不过这个误差已经很小了,可以忽略.

可以参考《IEEE745浮点数计算标准》,所有的浮点数运算都是近似的。

C++里面 为什么 0.1+0.2-0.3不等于0 而等于一个很接近0的小数?
因为c++语言 直接 用计算机标准的表示小数的方式(IEEE浮点数格式)表示和保存小数,而这个方式保存0.1 0.2 0.3都是不能像用纸笔写0.1那样“准确”表示的。int cmp(const void* a, const void* b)。如果返回负数,说明a排在b前面。如果返回正数,说明a排在b后面。如果返回0,说明a和b无先后关...

java中(0.1+0.2)+o.3和0.1+(0.2+0.3)的结果为什么不相等呢
为什么“0.1+0.2=0.30000000000000004”?首先声明这不是bug,原因在与十进制到二进制的转换导致的精度问题!其次这几乎出现在很多的编程语言中:C\/C++,Java,Javascript中,准确的说:“使用了IEEE 754浮点数格式”来存储浮点类型(float 32,double 64)的任何编程语言都有这个问题!简要介绍下IEEE 754浮...

C++里面 为什么 0.1+0.2-0.3不等于0 而等于一个很接近0的小数
因为c++语言 直接 用计算机标准的表示小数的方式(IEEE浮点数格式)表示和保存小数,而这个方式保存0.1 0.2 0.3都是不能像我们用纸笔写0.1那样“准确”表示的,它只能尽可能地接近地表示,我们如果要较真,那么c++表示的0.1 0.2 0.3都不是等于我们日常算术计算的0.1 0.2 0.3的值的,它们在...

相似回答