2017-01-23 1 views
0

J'essaie un défi sur codewars.com, mais je n'arrive pas à comprendre pourquoi mon code ne peut pas passer les cas de test. Je suis supposé arrondir tous les nombres flottants à 2 points décimaux dans un dictionnaire . J'ai fait quelques recherches et trouvé Round off dict values to 2 decimals et Python - how to round down to 2 decimals. J'ai également testé le code sur mon PC local et il passe tous les tests. Cependant, le troisième cas de test est un test caché sur codewars.com car codewars.com a deux tests visibles par l'utilisateur mais le code doit passer trois tests. J'ai trouvé le troisième cas de test du message retourné par codewars.com qui est montré ci-dessous.Arrondir les nombres flottants dans un dictionnaire

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} 

Les deux cas de test qui sont visibles à l'utilisateur à codewars.com sont

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}) 

Mon code et testcases que je l'ai utilisé pour tester le même code sont présentés ci-dessous

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() 

Des instructions détaillées pour le défi peuvent être trouvées here. Veuillez m'aider à identifier pourquoi mon code ne peut pas passer le test caché. Merci.

Répondre

1

J'ai essayé d'exécuter votre code et cela fonctionne. Peut-être que vous pouvez essayer d'utiliser round pour arrondir le nombre flottant dans n'importe quelle décimale comme suit:

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