【发布时间】:2016-11-27 02:02:30
【问题描述】:
我想在 Place 模型中保存纬度和经度。 我尝试了两个字段,floatfield 和 decimalfield。
1。 FloatField 模型
class Place1(models.Model):
latitude = models.FloatField()
longitude = models.FloatField()
2。 DecimalField 模型
class Place2(models.Model):
latitude = models.DecimalField(max_digits=18, decimal_places=16)
longitude = models.DecimalField(max_digits=19, decimal_places=16)
两个字段都适用于以下值。
10.1
10.12
10.123
10.1234
...
10.1234567890123
但是,在第 16 位数字(不是“十六位小数”)之后,在保存时会无意四舍五入。
place1 = Place1.objects.create(
latitude=10.123456789012345,
longitude=100.123456789012345
)
>>place1.latitude
10.123456789012345 # works well
>>place1.longitude
100.123456789012345 # works well
# Unintentionally rounded when I get object from db.
>>Place.objects.last().latitude
10.12345678901235 # unintentionally rounded
>>Place.objects.last().longitude
100.1234567890123 # unintentionally rounded
place2 = Place2.objects.create(
latitude=Decimal('10.123456789012345'),
longitude=Decimal('100.123456789012345')
)
>>place2.latitude
Decimal('10.1234567890123450') # works well
>>place2.longitude
Decimal('100.1234567890123450') # works well
# Unintentionally rounded when I get object from db.
>>Place.objects.last().latitude
Decimal('10.1234567890123500') # unintentionally rounded
>>Place.objects.last().longitude
Decimal('100.1234567890123000') # unintentionally rounded
我在 django 文档中找不到有关此“无意回合”的任何解释。请帮忙。谢谢。
【问题讨论】:
-
哪个数据库、操作系统和架构?
-
我的服务器是ubuntu 64bit mysql。我的本地是 ubuntu 64bit。 mysql和localhost sqlite都会出现这个问题。
标签: python django floating-point decimal latitude-longitude