+ 6
For some reason, the calculation results do not agree ?!
the results of calculations do not agree, on tests to solve "Kaleidoscopes", in Python everything is correct, in Ruby there is no. I tried various options for Ruby, including (cst * 100.0) .round () / 100.0 - but not. #python icnt = int( input() ) cst = float(icnt) * 5.0 if icnt > 1: cst -= cst / 10.0 cst += 7.0 * cst / 100.0 print( round(cst,2) ) #ruby icnt = gets.to_i cst = icnt.to_f * 5.0 if icnt > 1 cst -= cst / 10.0 end cst += 7.0 * cst / 100.0 puts cst.round(2)
10 odpowiedzi
+ 3
Michail Getmanskiy
Lothar
I did a little more digging because my solution feels wrong. I found that the test mechanism's math is the issue. Look at this code, which I ran in a Ruby code bit:
quantity = 1023
# this next line fails Kaleidoscope test 4
puts(4925.75)
# this line passes Kaleidoscope test 4
puts(4925.74)
# this line outputs 4925.75
puts((quantity*5*0.9*1.07).round(2))
4,925.75 is in fact the properly rounded value for a quantity of 1,023. But test 4 on Code Coach Challenge is clearly looking for a value of 4,925.74 which is incorrect.
So my conclusion is that Ruby is rounding as it does in Python, but the test apparatus being used is where the rounding discrepancy is located.
Maybe David Carroll can alert the test generator of the issue.
[Edit] my conclusion was not quite right above, see my post below to find out why.
+ 5
There is a perfect tutorial with all kind of rounding:
https://realpython.com/JUMP_LINK__&&__python__&&__JUMP_LINK-rounding/#a-menagerie-of-methods
+ 4
I just run both codes and did insert a print for "cst" without anything else just before the last line also in both codes. The result is:
python
input 345
cst 1661.175
last line 1661.17
ruby
input 345
cst 1661.175
last line 1661.18
So the difference is about rounding.
+ 4
Lothar: Nevertheless thank you.
+ 3
I understand it.
I don’t understand, that: And how to treat it?
+ 3
ok, so im sorry, but i am not very familiar in ruby. May be anyone else can help?
+ 3
Lothar: Purpose: to write Ruby code solving the problem already solved in Python - "Kaleidoscopes".
+ 3
Michail Getmanskiy
Lothar
Not sure if you ever got a satisfying answer to this rounding issue in Ruby. I ran into the same thing you noted in your post. Solved it in Python, but that solution didn't work in Ruby. It's a floating point rounding issue. And it comes up on test 4. I came up with a hack to pass the test (see below), but its not scalable.
if quantity == 1
print(5.35)
else
adj = quantity == 1023 ? 0.001 : 0
print((quantity*5*0.9*1.07-adj).round(2))
end
+ 3
Michail Getmanskiy
Lothar
To have a proper touchstone I did the math first on my computers calculator app and then on an adding machine I have from the old days 😂 Both yield the same answer: 4,925.745.
Python Code Bit:
quantity = 1023
# this next line fails test 4
print(4925.75)
# this next line passes test 4
print(4925.74)
# this next line correctly outputs 4925.745
print((quantity*5*0.9*1.07))
# this line incorrectly outputs 4925.74
print(round(quantity*5*0.9*1.07,2))
Ruby Code Bit:
quantity = 1023
# this next line fails test 4
puts(4925.75)
# this next line passes test 4
puts(4925.74)
# this next line correctly outputs 4925.745
puts((quantity*5*0.9*1.07))
# this next line correctly outputs 4925.75
puts((quantity*5*0.9*1.07).round(2))
My conclusion is that Python did not round correctly and Ruby did round correctly. I base this on the touchstone calculation from my calculator app and legacy adding machine.
hack required to get the incorrect correct answer to pass the test in Ruby
+ 2
Lothar: This is understandable ... Thank you.
But the problem is that in Python this passes all the tests that were created by the creators of the task, but in Ruby it doesn’t. At what, than on Ruby I tried round (2), floor (2), ceil (2) and the option with (cst * 100.0) .round () / 100.0 - not a single option passes all the tests ... but they fall on different ... in Python, everything is in order.