나는 통해 보았다 : Why can't decimal numbers be represented exactly in binary? 및 Why Are Floating Point Numbers Inaccurate?이루비 반올림하고 소수의 형식
내가 라운드와 루비를 사용하여 부동 소수점 숫자 형식, 결과는 여전히 수학을 수행 한 결과 다른 때 나의 질문은손을 구매 . 다음은이의 예입니다
편집 2
[28] pry(main)> #####################################
[29] pry(main)> # test one
[30] pry(main)> #####################################
[31] pry(main)> foo = (6.0135 * (650000/1000))
=> 3908.7749999999996
[32] pry(main)> foo = '%.2f' % foo.round(2)
=> "3908.77"
[33] pry(main)> # should be 3908.78
[36] pry(main)> #####################################
[37] pry(main)> # test two
[38] pry(main)> #####################################
[39] pry(main)> foo = 650000/1000
=> 650
[40] pry(main)> foo = foo * 6.0135
=> 3908.7749999999996
[41] pry(main)> foo = '%.2f' % foo.round(2) # should be 3908.78
=> "3908.77"
[44] pry(main)> #####################################
[45] pry(main)> # test three
[46] pry(main)> #####################################
[47] pry(main)> foo = 650000/1000
=> 650
[48] pry(main)> foo = foo * 6.0135
=> 3908.7749999999996
[49] pry(main)> foo = foo.round(2) # should be 3908.78
=> 3908.77
[52] pry(main)> #####################################
[53] pry(main)> # test four - The result of test four is expected
[54] pry(main)> #####################################
[55] pry(main)> foo = 650000/1000
=> 650
[56] pry(main)> foo = foo * 6.0135
=> 3908.7749999999996
[57] pry(main)> foo = '%.2f' % foo
=> "3908.77"
[58] pry(main)> #####################################
[59] pry(main)> # test five
[60] pry(main)> #####################################
[61] pry(main)> foo = 650000/1000
=> 650
[62] pry(main)> foo = foo * 6.0135
=> 3908.7749999999996
[63] pry(main)> foo = foo.round(5)
=> 3908.775
테스트 1 : 이것은 나에게 문제를주고 내 라이브러리에서 사용하는 일반적인 공식이다.
테스트 2 : '%.2f' %
이 일을 자릅니다 일부 반올림 문제를 일으키는 것으로 알려져있다 글쎄, 어쩌면 이것은이다 : 여기에 내 생각은 어쩌면 몇 가지 문제
시험 (3)를 일으키는 하나 개의 할당에서 두 작업을하는 것이 었습니다 문제.
시험 4 : '%.2f' %
이 문제가 아니기 때문에 .round(2)
이 문제의 원인 일 수 있습니다.
편집 2 : 테스트 5 : 난 내가 (. 즉, 라운드 다시 (2) 그 숫자)와 함께 작동 할 수있는 번호를보고있다 ROUND 숫자를 확장합니다. 하지만 이것은 일반적인 경우가 아닌 제한된 경우에 효과가있는 불안정한 솔루션처럼 보입니다.
부동 소수점이 정확하지 않은 것에 대해서는별로 신경 쓰지 않습니다. 제 질문은이 번호를 올바르게 반올림하여 올바른 답을 얻을 수 있도록하는 것입니다 (수동으로 작업을 수행 한 경우 얻을 수있는 대답).
또한 일반적으로 도징 포인트 오류를 수정하기위한 반올림에 대한 모범 사례가 있습니까? 부동 소수점 숫자를 나타 내기 위해서는 두 개의 정수를 사용하는 것이지만, 번거로 웠습니다.
감사합니다.
편집 한
당신이 .round(5)
대신 .round(2)
의 사용하면 답이 있어야한다 무엇에 비교할 때 좀 더 합리적인 답변을 얻을 것입니다. 라운드 안의 숫자를 늘리는 데 단점이 있습니까?
왜 downvote? –
이 라운드는 정확합니다. 3908.77499999 .. 실제로 3908.775보다 작기 때문에 항상 3908.77이됩니다. 당신은 항상 전체 값을 반올림하고, 마지막 숫자를 중심으로 시작한 다음 앞으로 나아 가지 마십시오 .... –
실제 답변은 3908.78이어야합니다. '.round (5)'를 사용하면 3908.78을 얻을 수 있습니다. –