十进制浮点数与二进制的相互转换

2023-12-22

简而言之,我的问题是,为什么浮点数中的舍入误差仅在计算后出现,而不是在存储文字时出现?

我的意思是这样的—— 我知道在十进制与二进制相互转换时由于浮点数的舍入误差而出现的问题。

例如,在 Java 中:

double a = 10.567;
double b = 2.16;
double c = a * b;

然后,c 存储值 22.824720000000003,而不是 22.82472。

这是因为结果22.82472无法准确地存储在double类型的有限二进制数字中。然而,10.567 和 2.16(即 a 和 b)也不能。

但是如果我打印 a 和 b 的值,它们会被准确地打印出来,没有任何舍入误差。为什么这里没有显示舍入误差?

这是否意味着浮点文字的表示与浮点计算结果的表示有所不同?


文字转换中存在舍入误差,它恰好对您隐藏。 10.567 无法用二进制表示,因此它会四舍五入到最接近的可表示值double值为

10.56700000000000017053025658242404460906982421875

然而,该算法不是打印精确的值(这会相当烦人),而是打印尽可能少的数字,这样如果将其转换回二进制,它将给出相同的值(在本例中为“10.567”)。

事实证明,对于doubles,您可以对最多 15 位的任何小数执行此操作,请参阅http://www.exploringbinary.com/number-of-digits-required-for-round-trip-conversions/ http://www.exploringbinary.com/number-of-digits-required-for-round-trip-conversions/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

十进制浮点数与二进制的相互转换 的相关文章

  • 如何找到最简单的人类可读的浮点字符串,该字符串在转换回浮点时会产生相同的字节?

    对于大多数数字 我们知道任何浮点值都会存在一些精度误差 对于 32 位浮点数 计算出大约 6 个有效数字 在您开始看到不正确的值之前 这将是准确的 我正在尝试存储一个人类可读的值 该值可以读入并重新创建序列化值的位精确重建 例如 值555
  • 将 .NET 小数存储到 MySQL 中的最佳字段定义是什么?

    我需要将小数存储到 MySQL 中 它可以具有不同的精度 因此我很想知道哪种 MySQL 字段类型绝对等同于 NET 的字段类型decimal http msdn microsoft com en us library system dec
  • C++长双精度打印所有数字

    关于我的问题 我在这里看到了一篇文章 但不明白 因为我是 C 新手 我编写了一个小脚本 它从用户那里获取一个数字 然后脚本打印出输入数字的阶乘 一旦我输入了像 30 这样的更大的数字 脚本就不会打印出所有的数字 输出就像 2 6525285
  • Python 中的二进制相移键控

    我目前正在编写一些代码 以使用音频转换通过激光传输消息 文件 和其他数据 我当前的代码使用 python 中 binascii 模块中的 hexlify 函数将数据转换为二进制 然后为 1 发出一个音调 为 0 发出不同的音调 这在理论上是
  • 如何将字符串转换为带有“tail”的浮点数?

    我在将字符串转换为浮点数时遇到问题 print gettype value id returns string var dump value id returns string 34 7140 length 7 float floatval
  • 在Python中创建32位浮点wav文件?

    我想在 Python 2 x 中创建 32 位浮动 WAV 文件 虽然 标准 WAV 文件通常使用 int 但许多专业音频应用程序将音频数据处理 并保存 为 float 标准波形模块无法执行此操作 http bugs python org
  • Haskell 二进制解析

    我一直在尝试在 haskell 中实现一个协议解析器 而且我对这门语言还很陌生 特别是当涉及到 monad 时 我一直在使用binary 0 5 0 2 并描述了协议的标头和所有有效负载 我想要解析的消息如下所示 header payloa
  • 二元除法问题:互联网上的坏例子或者我错过了什么?

    我想创建一个 16 位 CRC 实际上我已经完全准备好了 所以几个小时前我测试了它 但没有正常工作 但我发现互联网上的例子在涉及二进制除法时可能是错误的 我只链接其中两个 来自很多 http www ross net crc downloa
  • ARM、VFP、浮点、惰性上下文切换

    我正在为 ARM 处理器 Cortex A9 编写操作系统 我正在尝试实现浮点寄存器的延迟上下文切换 这背后的想法是 浮点扩展最初对线程禁用 因此不需要在任务切换上保存浮点上下文 当线程尝试使用浮点指令时 会触发异常 然后 操作系统启用浮点
  • Float 和 Int 都是 4 字节?怎么会?

    Int 为 4 个字节 范围为 2 31 浮点数为 4 个字节 范围为 1 2E 38 Float 包含实线上更多的点 但等于 int 的大小 float 的符号 指数 分数表示形式是否如此出色 或者 Int 的 2 的补码如此可悲 以至于
  • 使用 C++ hex 和 cin

    如果您有以下代码 cout lt lt hex lt lt 10 输出为 a 表示十进制 10 转换为其十六进制值 然而 在下面的代码中 int n cin gt gt hex gt gt n cout lt lt n lt lt endl
  • OpenMP 与浮点范围并行

    我有以下程序 int main double sum 0 pragma omp parallel for reduction sum for double x 0 x lt 10 x 0 1 sum x x 当我编译它时 我收到错误inva
  • 如何手动(按位)执行(浮动)x?

    现在 这是我应该实现的函数的函数头 float from int Return bit level equivalent of expression float x Result is returned as unsigned int bu
  • Python 中的二进制缓冲区

    在Python中你可以使用StringIO https docs python org library struct html用于字符数据的类似文件的缓冲区 内存映射文件 https docs python org library mmap
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • C 中的浮点运算是否具有结合律?

    加法在数学上具有结合律 a b c a b c 在一般情况下 此属性不适用于浮点数 因为它们表示有限精度的值 作为优化的一部分 从 C 程序生成机器代码时 编译器是否允许进行上述替换 C标准中到底在哪里说的 不允许编译器执行 优化 这将导致
  • 将浮点值转换为灰度十六进制颜色值

    这个问题又快又简单 我有一个二维浮点数组 0 0000000 到 1 0000000 我想将这些数字转换为颜色值 000000 到 ffffff 请注意 我所说的只是灰度值 0 黑色 0 5 中灰色 1 白色 有谁知道如何用 javascr
  • 如何使用正则表达式验证带有可选百分比符号的小数?

    正如问题的标题 我需要使用以下值验证正则表达式 最多 2 个小数位和 9 个整数 带有可选的百分比符号 Valid 10 0 1111111 12 15 2 10 2 3 Invalid 12 02 123456789123 123 I t

随机推荐