首先:我是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规范近似),但我需要技巧。。。我错过了什么?
我忽略了根据IEEE754浮点和双精度的表示,这就是这个谜团的解决方案。
FLOAT(32位)的尾数为23位(8百万个可能值=
这意味着Mysql不能显示不存在的内容(在我的例子中是浮点大数字),并用零填充“随机”无意义的数字。
>
一个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生成随机高斯。我需要将此高斯转换为浮点值。但是,高斯是双精度的,因此我需要某种方式进行舍入然后将其转换为浮点数。我需要四舍五入到最接近的整数。这是我的问题:如何? 问题答案: 要么 取决于您是指“四舍五入到最接近的整数”(四舍五入)还是“向上舍入”(上限)。 当心将双精度数转换为浮点数时会失去精度,但这在这里不应该成为问题。