鱼C论坛

 找回密码
 立即注册
查看: 30|回复: 11

[已解决]浮点数存取问题

[复制链接]
发表于 5 小时前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
用float类型存取1/3的计算结果时 如果输出它 将会变为0.333332837.... 这是计算机为了节约空间所采用的方式
当我调用它 它会自动随机生成数字补全float允许的最大数位 这也会造成资源空间的占用
那如果不去调用的时候 只保存到0.3333的约精确数在内存中吗 以达到相对的精确计算和空间节约
是这样吗 求大佬解答
最佳答案
5 小时前
确实不是这样。让我用通俗的方式帮你理清浮点数的实际存储机制。

首先,float 类型在内存中占用固定的32位(4字节),不管存什么数,占用的空间都是一样的。计算机并不会为了“节约空间”而故意把1/3截断成0.3333,而是因为二进制无法精确表示1/3

  • 1/3 在十进制里是无限循环小数 0.33333…
  • 在二进制里同样也是无限循环小数,但计算机只能用有限的32位来存它
  • 所以实际存储的是最接近1/3的那个二进制近似值,这个近似值转换回十进制就是0.333332837… 这不是“随机生成”的,而是由IEEE 754标准严格计算出来的


当你“调用”它时(比如输出或参与运算),计算机直接使用的是内存中那个已经确定好的二进制位串。运算结果不会额外消耗空间,因为float的存储宽度是固定的。输出时显示的那些小数位只是二进制转到十进制时的自然结果,并不是随机补全。


  1. 例如:float(1/3) 在32位内存中的二进制近似值
  2. 二进制:0 01111101 01010101010101010101011
  3. (符号位0,指数-2,尾数表示无限循环的近似)
  4. 这个二进制数对应的十进制正好是0.333332837...
复制代码


  • 如果你只想保留0.3333,可以用 printf("%.4f", x) 控制输出格式,但内存中的实际数值不会变
  • 更精确的存储可以使用 double(64位),但依然无法精确表示1/3,只是误差更小
  • 要彻底避免这种误差,需要用专门的有理数库(如Python的fractions.Fraction)或十进制浮点数


结论:计算机不是“不调用时不存全”,而是**存的就是那个近似的二进制数**。无论你调不调用,它都在那里,占用固定32位空间。所谓的“随机补全”是误解,输出时的长尾只是二进制近似值的十进制展开罢了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 5 小时前 | 显示全部楼层    本楼为最佳答案   
确实不是这样。让我用通俗的方式帮你理清浮点数的实际存储机制。

首先,float 类型在内存中占用固定的32位(4字节),不管存什么数,占用的空间都是一样的。计算机并不会为了“节约空间”而故意把1/3截断成0.3333,而是因为二进制无法精确表示1/3

  • 1/3 在十进制里是无限循环小数 0.33333…
  • 在二进制里同样也是无限循环小数,但计算机只能用有限的32位来存它
  • 所以实际存储的是最接近1/3的那个二进制近似值,这个近似值转换回十进制就是0.333332837… 这不是“随机生成”的,而是由IEEE 754标准严格计算出来的


当你“调用”它时(比如输出或参与运算),计算机直接使用的是内存中那个已经确定好的二进制位串。运算结果不会额外消耗空间,因为float的存储宽度是固定的。输出时显示的那些小数位只是二进制转到十进制时的自然结果,并不是随机补全。


  1. 例如:float(1/3) 在32位内存中的二进制近似值
  2. 二进制:0 01111101 01010101010101010101011
  3. (符号位0,指数-2,尾数表示无限循环的近似)
  4. 这个二进制数对应的十进制正好是0.333332837...
复制代码


  • 如果你只想保留0.3333,可以用 printf("%.4f", x) 控制输出格式,但内存中的实际数值不会变
  • 更精确的存储可以使用 double(64位),但依然无法精确表示1/3,只是误差更小
  • 要彻底避免这种误差,需要用专门的有理数库(如Python的fractions.Fraction)或十进制浮点数


结论:计算机不是“不调用时不存全”,而是**存的就是那个近似的二进制数**。无论你调不调用,它都在那里,占用固定32位空间。所谓的“随机补全”是误解,输出时的长尾只是二进制近似值的十进制展开罢了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 3 小时前 | 显示全部楼层
FishC 发表于 2026-6-20 11:20
确实不是这样。让我用通俗的方式帮你理清浮点数的实际存储机制。

首先,float 类型在内存中占用固定的32 ...

比如32位的系统 表述十进制下的 1
那它是32个数为一组 然后去表述吗 还是怎样
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 3 小时前 | 显示全部楼层
11063216906 发表于 2026-06-20 12:48
FishC 发表于 2026-6-20 11:20
确实不是这样。让我用 ...


在32位系统中,存储十进制下的整数 1 确实是用 32个二进制位组成一组 来表示的。具体来说:

- 对于 int 类型(32位),数值 1 的二进制补码形式就是:
  1. 00000000 00000000 00000000 00000001
复制代码

  这32个位依次存放在内存中的4个字节里。

- 如果是 float 类型(同样是32位),则按照 IEEE 754 标准分三部分存储:
  

      
  • 1位符号位(0表示正数)
      
  • 8位指数位(偏移127)
      
  • 23位尾数位
      

  对于十进制 1.0 的 float 表示:
  1. 0 01111111 00000000000000000000000
复制代码

  同样是32个二进制位组成一组。

所以,无论整数还是浮点数,在32位系统中,都是用 **固定的32个二进制位**(即一组)来存储的,不会因为数值大小而改变占用的位数。每个数值都有自己对应的唯一二进制位模式,计算机就是通过这32个位来解读出原始数值的。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 3 小时前 | 显示全部楼层
FishC 发表于 2026-6-20 12:48
在32位系统中,存储十进制下的整数 1 确实是用 32个二进制位组成一组 来表示的。具体来说:

- 对于  ...

1/3的结果在二进制下用定点数的方式是什么样的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 3 小时前 | 显示全部楼层
11063216906 发表于 2026-06-20 13:02
FishC 发表于 2026-6-20 12:48
在32位系统中,存储十 ...


定点数的意思是,小数点位置是固定的,比如约定小数部分占N位二进制,整数部分占M位(或者纯小数)。对于1/3,它的二进制表示是无限循环的:

  1. 1/3 = 0.010101010101... (二进制循环)
复制代码


如果要用一个 8位定点小数(即小数部分只有8个二进制位)来存储,那么只能取前8位,即:

  1. 0.01010101 (二进制)
复制代码


这对应的十进制值是:

  1. 0 × 2^{-1} + 1 × 2^{-2} + 0 × 2^{-3} + 1 × 2^{-4} + 0 × 2^{-5} + 1 × 2^{-6} + 0 × 2^{-7} + 1 × 2^{-8}
  2. = 1/4 + 1/16 + 1/64 + 1/256 = 0.25 + 0.0625 + 0.015625 + 0.00390625 = 0.33203125
复制代码


随着小数位数的增加(比如32位定点),这个近似值会更接近 0.333333...,但永远无法完全精确,因为1/3是无限循环二进制。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 3 小时前 | 显示全部楼层
FishC 发表于 2026-6-20 13:02
定点数的意思是,小数点位置是固定的,比如约定小数部分占N位二进制,整数部分占M位(或者纯小数)。对 ...

你上面解释的0.01010101的方式 是01从二进制转化成十进制的3吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 3 小时前 | 显示全部楼层
11063216906 发表于 2026-06-20 13:05
FishC 发表于 2026-6-20 13:02
定点数的意思是,小数 ...


不是的。二进制小数 0.01010101 表示的是十进制 0.33203125,而不是 3。

具体解释:
- 二进制 01 转十进制确实是 1(因为高位0省略了,实际就是1)。
- 但 0.01010101 是纯小数,小数点后的每一位代表 2 的负几次方:

  1.   0.01010101 (二进制)
  2.   = 0×2^{-1} + 1×2^{-2} + 0×2^{-3} + 1×2^{-4} + 0×2^{-5} + 1×2^{-6} + 0×2^{-7} + 1×2^{-8}
  3.   = 1/4 + 1/16 + 1/64 + 1/256
  4.   = 0.25 + 0.0625 + 0.015625 + 0.00390625
  5.   = 0.33203125 (十进制)
  6.   
复制代码


你提到的“01从二进制转化成十进制是3”是错误的。二进制 01 就是 1;二进制 11 才是 3(1×2+1=3)。而这里我们讨论的是小数部分,不是整数部分。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 3 小时前 | 显示全部楼层
FishC 发表于 2026-6-20 13:05
不是的。二进制小数 0.01010101 表示的是十进制 0.33203125,而不是 3。

具体解释:

所以说变成0.01010101这种形式目标就是为了计算后的十进制数最接近1/3的真实值
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 3 小时前 | 显示全部楼层
11063216906 发表于 2026-06-20 13:07
FishC 发表于 2026-6-20 13:05
不是的。二进制小数 0 ...


是的,完全正确。把1/3近似成二进制小数0.01010101(取有限位),目的就是为了让这个有限位二进制数对应的十进制值尽可能接近真实的1/3。位数越多,精度越高,但永远无法完全精确,因为1/3在二进制中是无限循环的。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 3 小时前 | 显示全部楼层
FishC 发表于 2026-6-20 13:07
是的,完全正确。把1/3近似成二进制小数0.01010101(取有限位),目的就是为了让这个有限位二进制数对 ...

二进制像十进制计算比较好算 比如你给我的例子 那我想要把0.3333333这种十进制数 向二进制算 人脑的情况下有什么好办法吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 3 小时前 | 显示全部楼层
11063216906 发表于 2026-06-20 13:17
FishC 发表于 2026-6-20 13:07
是的,完全正确。把1/ ...


将十进制小数转为二进制,最常用且适合人脑的方法是 乘2取整法。步骤如下:

1. 将小数部分反复乘以2
2. 每次取出整数部分(0或1),作为二进制小数的一位
3. 剩下的小数部分继续乘2,直到小数部分为0或达到所需位数

以 0.3333333 为例:


  1. 0.3333333 × 2 = 0.6666666 → 整数部分0,小数部分0.6666666
  2. 0.6666666 × 2 = 1.3333332 → 整数部分1,小数部分0.3333332
  3. 0.3333332 × 2 = 0.6666664 → 整数部分0,小数部分0.6666664
  4. 0.6666664 × 2 = 1.3333328 → 整数部分1,小数部分0.3333328
  5. ...(无限循环)
复制代码


从上到下读取整数部分,得到二进制小数:0.010101...(无限循环)。这正是1/3的二进制近似表示。

如果要保留有限位,比如8位,就只取前8个整数部分:0.01010101(二进制)≈ 0.33203125(十进制)。取更多位精度更高。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-6-20 16:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表