문제

이 아이디어에 대한 아이디어가 있습니까?

우리가 달릴 때 :

printf("%.0f", 40.5)

Windows 상자에서 반환은 "41"이지만 제작 Ubuntu 서버에서는 "40"을 받고 있습니다.

도움이 되었습니까?

해결책

간단한 경우처럼 보입니다 바이너리 플로팅 포인트 부정확. 하나의 기계에서는 40.499999999999999999999999999999999999999999999999 곳 사이입니다. 다른 컴퓨터에서는 40.500000000001이 41로 표시됩니다.

정확한 숫자가 필요한 경우 바이너리 플로팅 포인트를 사용해서는 안됩니다. 고정점 소수점 또는 소수점 부동 소수점을 사용할 수 있습니다.

편집 : 당신은 bigdecimal을 사용하고 있습니다. 사용하여 플로트로 변환하는 것을 피하지 않겠습니까? #round 그리고 #to_i? (또는 #floor 또는 #ceil 대신에 #round... 당신의 목표가 무엇인지는 확실하지 않습니다.)

b = BigDecimal.new("40.5")
print b.round.to_i  # => 41

다른 팁

사용하는 것은 어떻습니까 .round 대신에? 레일은 정밀도를 지정할 수 있도록 강화됩니다 (API 문서를 참조하십시오).

대신 %.0g을 사용하십시오

Scottj의 답변은 귀하의 문제를 설명하지 않습니다. 40.5는 이진으로 정확하게 표현됩니다. 아마도 일어나고있는 것은 이것입니다 : Windows 'Printf "Rounds Half Up", Ubuntu의 Printf는 "반으로 짝수"입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top