Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite3数据库中的1.2实际上是1.19999998_Sql_Sqlite_Floating Point - Fatal编程技术网

SQLite3数据库中的1.2实际上是1.19999998

SQLite3数据库中的1.2实际上是1.19999998,sql,sqlite,floating-point,Sql,Sqlite,Floating Point,我试图使用java在SQLite3数据库中存储一个浮点。当我将数字1.2存储在数据库中时,它实际上存储为1.19999998&每个偶数(1.4、1.6等)都会发生同样的情况 这使得删除行非常困难,因为我根据其版本列(其类型=float)删除行。所以这一行行不通: “从tbl中删除,其中版本=1.2” 那是因为没有1.2,只有1.199998。当我在SQLite3数据库中存储浮点时,如何确保它是我输入的准确数字?如果需要精确的精度,请不要使用浮点。试试十进制。这正是浮点数的本质。它们并不精确。 我

我试图使用java在SQLite3数据库中存储一个浮点。当我将数字1.2存储在数据库中时,它实际上存储为1.19999998&每个偶数(1.4、1.6等)都会发生同样的情况

这使得删除行非常困难,因为我根据其版本列(其类型=float)删除行。所以这一行行不通: “从tbl中删除,其中版本=1.2”


那是因为没有1.2,只有1.199998。当我在SQLite3数据库中存储浮点时,如何确保它是我输入的准确数字?

如果需要精确的精度,请不要使用浮点。试试十进制。

这正是浮点数的本质。它们并不精确。
我建议您使用整数或文本字段来存储版本。

您永远不应该依赖浮点或双精度。浮点数决不能用于数据库中的键或表示货币

在这种情况下,您可能应该使用十进制

浮动不是一种精确的数据类型。它们被设计为速度快、值范围大、内存占用小

它们通常使用IEEE标准来实现


请记住,您在源代码中输入的1.2或用户在文本框中输入并最终进入数据库的1.2实际上存储为二进制值(通常以称为IEEE754的格式)。要了解这是一个问题的原因,请尝试手动将1.2(1 1/5)转换为二进制(二进制.1是1/2,.01是1/4),然后查看最终结果:

1.001100110011

您可以通过使用来节省时间(忽略在站点中断循环的最后一个“1”-因为转换器必须舍入最后一个数字)


正如你所看到的,这是一个重复的模式。这种情况几乎永远持续下去。这就像试图将1/3表示为十进制。为了解决这个问题,大多数编程语言都有一种十进制类型(与float或double不同),它保持以10为基数的表示形式。然而,使用这种类型进行的计算要慢几个数量级,因此它通常用于金融交易等。

正如Joel Coehoorn指出的,1.2是循环分数1.0011 0011 0011。。。在二进制中,不能用有限的位来精确表示

使用IEEE 754
float
可获得的最接近值为1.2000000476837158203125。使用
double
可以获得的最接近值为1.19999999995559107901499937383830547332763671875。我不知道你从哪里得到1.19999998

浮点被设计用于表示近似量:物理测量(游泳池的深度永远不会精确到1.2米),或非有理值函数,如
sqrt
log
,或
sin
。如果您需要精确到15位有效数字的值,它可以正常工作。如果你真的需要一个精确的值,不要太多


对于版本号,更合适的表示形式是一对整数:一个用于主版本,一个用于次版本。这也将正确处理序列1.0、1.1、…、1.9、1.10、1.11,这将在
REAL
列中错误排序。

谢谢,您能告诉我小数点后的两个参数(param、param)是什么意思吗?十进制(大小,长度),我想这就是参数的意思,对吗?所以,如果我想存储3点十进制数,我应该声明一个类似于So decimal(3,0)的列吗?decimal的参数是精度和比例。精度定义存储的总位数,比例定义小数点后的位数。这正是@Alex Deem所说的。因此,十进制(4,1)将支持123.4(总共四位,小数点后一位),但不支持1.234或1000.0。出于您的目的,我建议使用类似十进制(10,5)的方法来覆盖广泛的数字。SQLite不支持十进制。