当前位置: 首页 > 知识库问答 >
问题:

MySQL(MariaDB)浮点可视化:为什么值要四舍五入到数百或数千?

赫连彬炳
2023-03-14

首先:我是MySql新手,看起来我错过了一些重要的东西。

在MySQL数据库中,我的浮点值从单位到数十亿不等。我花了几天的时间试图理解为什么所有的数字都不超过6个有效数字,而不太有效的数字设置为0:

即。:

select `field` from `table`;
(instead of X -> i get Y)
  1 -> 1
  12 -> 12
  123 -> 123
  1234 -> 1234
  12345 -> 12345
  123456 -> 123456
  1234567 -> 1234570
  12345678 -> 12345700
  123456789 -> 123457000

只有用我找到的“技巧”我才能读取真正的值:

select `field`+0.0 from `table`;

我的问题是:这种奇怪行为背后的原因是什么?文档中在哪里描述了它?我发现完全不直观,我看不到正常选择的真实值(当然根据IEEE规范近似),但我需要技巧。。。我错过了什么?

共有2个答案

杜阳泽
2023-03-14

我忽略了根据IEEE754浮点和双精度的表示,这就是这个谜团的解决方案

FLOAT(32位)的尾数为23位(8百万个可能值=

这意味着Mysql不能显示不存在的内容(在我的例子中是浮点大数字),并用零填充“随机”无意义的数字。

冯枫涟
2023-03-14

>

  • 一个FLOAT有24位,或log10(224(超过7)位,具有重要意义:12345678.910存储在FLOAT中,作为1011110001100001010011112(即1234567910)。当显示为十进制时,客户端肯定知道从第8位开始的所有内容都绝对是错误的精度(因为FLOAT只能存储7位十进制精度)。因此,它会丢弃余数,留给您12345680

    双精度有53位,或log10位(253)(几乎16)位,意义重大:12345678.910存储在双精度中,作为10111100011001110.1110011100110011012(即12345678.900000003710)。当显示为十进制时,客户肯定知道从第16位开始的所有内容都是假精度(因为双精度只能存储15位精度的十进制数字)。因此,它将丢弃剩余部分,留给您12345678.9000000。

    当添加0.0时,MySQL首先将浮点转换为双精度。

  •  类似资料:
    • 问题内容: 假设我有,我想将其转换为。如何在Python中完成此操作? 给与不。我是Python或一般编程的新手。 我不想将其打印为字符串,结果将被进一步使用。有关此问题的更多信息,请查看 Tim Wilson的Python编程技巧:贷款和付款计算器 。 问题答案: (或的结果)正确舍入为小数点后两位。数学上,这听起来像您想要的是天花板功能。Python模块中的一个名为: 地板和天花板功能通常分别

    • C和C++提供了几种宽度的浮点数据类型,但它们没有指定精度。编译器可以自由地使用理想化的算术来简化表达式,使用双精度来计算值上的表达式,或者使用双精度寄存器来保留变量或公共子表达式的值。 纠正我如果我是错的是错的,请参见编辑,但是将内存中的提升到双精度寄存器中也是合法的,所以存储一个值然后加载回来并不一定会截断位。 将一个数字转换成一个较低精度的最安全、最便携的方法是什么?理想情况下,在SSE2上

    • 我如何四舍五入到两个小数位?

    • 获取以下数字集--> 当相加时,这些给出一个整数。

    • 问题内容: 如果值为,则应将其格式化为。如果是,那么应该是。 问题答案: 这是一个实用程序,可以将双精度舍入(而不是截断)双精度至小数位数。 例如: 原始版本;提防这个 这在小数位数很高(例如)或整数部分很大(例如)的极端情况下会严重崩溃。感谢Sloin指出这一点。 多年来,我一直在使用上面的方法将“不太大”的双精度取整到2或3个小数位(例如,以秒为单位的清理时间用于记录目的:27.9876543

    • 问题内容: 我正在使用java.util.Random生成随机高斯。我需要将此高斯转换为浮点值。但是,高斯是双精度的,因此我需要某种方式进行舍入然后将其转换为浮点数。我需要四舍五入到最接近的整数。这是我的问题:如何? 问题答案: 要么 取决于您是指“四舍五入到最接近的整数”(四舍五入)还是“向上舍入”(上限)。 当心将双精度数转换为浮点数时会失去精度,但这在这里不应该成为问题。