2017-01-23 9 views
0

나는 codewars.com에서 도전을 시도하고 있는데, 왜 내 코드가 테스트 케이스를 통과 할 수 없는지 알 수 없다. 사전 내의 소수점 2 자리까지 반올림해야한다. . 나는 약간 연구를하고 Round off dict values to 2 decimalsPython - how to round down to 2 decimals를 찾아 냈다. 또한 로컬 PC에서 코드를 테스트했으며 모든 테스트를 통과했습니다. 그러나 codewars.com은 사용자가 볼 수있는 두 가지 테스트가 있지만 코드는 세 가지 테스트를 통과해야하므로 세 번째 테스트 사례는 codewars.com의 숨겨진 테스트입니다. 아래에 나와있는 codewars.com에서 반환 한 메시지에서 세 번째 테스트 사례를 찾아 냈습니다. codewars.com에서 사용자에게 볼 수 있습니다사전에 반올림 부동 소수점 숫자

Basic Tests 
    ✔ Test Passed 
    ✔ Test Passed 
    ✘ {'A':-17.200000000000003,'C':-47.200000000000003,'B':-32.200000000000003, 
'E': 0.79999999999999716, 'D': 95.799999999999997} should equal {'A': -17.2, 
'C': -47.2, 'B': -32.2, 'E': 0.8, 'D': 95.8} 

두 개의 테스트 케이스는

내 코드와 나는 동일한 코드를 테스트하는 데 사용했다을 testcases가

from statistics import mean 
import unittest 
import math 
############## My Code #################################################### 
def split_the_bill(x): 
    keys = list(x.values()) 
    keys2 = list(x.keys()) 
    average = mean(keys) 
    keys3 = [(math.ceil((i-average)*100)/100) if type(i) == float else (i-average) for i in keys] 
    ans = dict(zip(keys2, keys3)) 

    return ans 

######################### My Test Case ########################### 
class MyTestCases(unittest.TestCase): 
    def test(self): 
     new_string = split_the_bill({'A': 20, 'B': 15, 'C': 10}) 
     self.assertEqual(new_string, {'A': 5, 'B': 0, 'C': -5}, 
         msg = "should return {'A': 5, 'B': 0, 'C': -5}") 
    def test1(self): 
     new_string = split_the_bill({'A': 40, 'B': 25, 'X': 10}) 
     self.assertEqual(new_string, {'A': 15, 'B': 0, 'X': -15}, 
         msg = "should return {'A': 15, 'B': 0, 'X': -15}") 

    def test2(self): 
     new_string = split_the_bill({'A': -17.200000000000003, 'C': -47.200000000000003, 'B': -32.200000000000003, 'E': 0.79999999999999716, 'D': 95.799999999999997}) 
     self.assertEqual(new_string, {'A': -17.2, 'C': -47.2, 'B': -32.2, 'E': 0.8, 'D': 95.8}, 
         msg = "should return {'A': -17.2, 'C': -47.2, 'B': -32.2, 'E': 0.8, 'D': 95.8}") 


if __name__ == "__main__": 
    unittest.main() 
다음과 같습니다

test.assert_equals(split_the_bill({'A': 20, 'B': 15, 'C': 10}), {'A': 5, 'B': 0, 'C': -5}) 
test.assert_equals(split_the_bill({'A': 40, 'B': 25, 'X': 10}), {'A': 15, 'B': 0, 'X': -15}) 

챌린지에 대한 광범위한 지침은 here입니다. 내 코드가 숨겨진 테스트를 통과하지 못하는 이유를 파악하는 데 도움이 될 수 있습니다. 감사.

답변

1

코드를 실행하려고 시도했지만 작동합니다. 어쩌면 을 사용하여 플로팅 숫자를 다음과 같이 십진수로 반올림 할 수 있습니다.

def split_the_bill(x): 
    keys = list(x.values()) 
    keys2 = list(x.keys()) 
    average = mean(keys) 
    keys3 = [(round(i-average, 1)) for i in keys] 
    ans = dict(zip(keys2, keys3)) 
    return ans