小编jey*_*gOh的帖子

django浮点数或十进制数在保存时无意舍入

我想在“位置”模型中保存纬度和经度。我尝试了两个字段,floatfield和decimalfield。

1. FloatField模型

class Place1(models.Model):
    latitude = models.FloatField()
    longitude = models.FloatField()
Run Code Online (Sandbox Code Playgroud)

2. DecimalField模型

class Place2(models.Model):
    latitude = models.DecimalField(max_digits=18, decimal_places=16)
    longitude = models.DecimalField(max_digits=19, decimal_places=16)
Run Code Online (Sandbox Code Playgroud)

这两个字段在以下值上均能正常工作。

10.1
10.12
10.123
10.1234
...
10.1234567890123

但是,在第16个数字(不是“ 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 …
Run Code Online (Sandbox Code Playgroud)

python django floating-point decimal latitude-longitude

5
推荐指数
1
解决办法
2232
查看次数