2017-03-17 1 views
0

cb, 66.45라는 GET 매개 변수를 구문 분석하여 float로 변환하여 66.45를 얻었습니다.django가 잘못된 자릿수를 사용하여 데이터를 쿼리합니다.

cb = request.GET.get("cb", '') 
if re.match('^\d+(\.\d+)?$', cb): 
    cb=float(cb) 
    params['cb'] = cb 

그리고 나는, DB의 데이터를 쿼리하는 데 사용되는 빈 얻었다. 디버깅, 쿼리 SQL 대신 66.4566.4500000000000028421709430404007434844970703125을 사용하는 경우

products = Product.objects.filter(**params) 

는 사실, 나는 발견하고 나의 빈 쿼리 결과를 일으켰습니다. 아무 잘못이

cb = models.DecimalField(max_digits=6, decimal_places=2, default=0) 

있습니까 :

cb은 아래 제품 모델에 정의? 나는 혼란 스럽다.

+0

부표는 정확한 유형이 아닙니다. 따라서 쿼리를 실행하기 전에 cb를 66.45로 줄이십시오. – Guinner

+0

타입 변환을하지 않고'cb'를 사용하여 시도해 보셨습니까? 즉, 문자열로 사용 하시겠습니까? –

+0

cb가 문자열로 사용될 때 mysql이이를 지원하기 때문에 작동합니다. 나는 파이썬 해석기에서 float로 cb를 캐스팅하려했는데 같은 결과를 얻었다. 왜 django 쿼리에서 사용될 때 정확하지 않게됩니까? 숫자를 던지면 너무 위험한가요? – Uphie

답변

0

@nik_m 및 @Renyuan wang에게 감사드립니다. 그것은 cb가 문자열이나 cb=Decimal(cb)으로 사용될 때 작동합니다.

저는 여전히 혼란 스럽습니다.

enter image description here

나는 장고 아마이 문제를 일으키는 생각,하지만 난 모르겠어요.

+0

당신은'print'를 믿어서는 안됩니다. float로'print'를위한 기본 포맷이 있다고 생각합니다. 'print ('% 3.15f'% cb)'를 시도하면 66.450000000000003이 될 것입니다. –

+0

예, 맞습니다. 장고는 cb의 가장 정확한 값을 사용합니다. 66 주조, 66.000 ... 000, 66.4가 66.400 ... 40625입니다. 때때로 캐스팅은 66.4 및 45.43과 같이 예상되는 정확한 값을 생성하지 않으며 때로는 66 및 45.5와 같은 예상되는 정확한 값을 만듭니다. 플로트 캐스팅을 신중하게 사용해야합니다. – Uphie

관련 문제