int ((0,1 + 0,7) * 10) = 7 em vários idiomas. Como evitar isso?

Recentemente me deparei com um bug / recurso em vários idiomas. Eu tenho um conhecimento muito básico sobre como isso é causado (e gostaria de uma explicação detalhada), mas quando penso em todos os erros que devo ter cometido ao longo dos anos, a questão é como posso determinar " Hey, isso pode causar um bug ridículo, é melhor eu usar funções de precisão arbitrárias ", que outros idiomas possuem esse bug (e aqueles que não têm,porqu). Além disso, por que 0,1 + 0,7 faz isso, ou seja, 0,1 + 0,3 não, existem outros exemplos conhecidos?

PHP

//the first one actually doesn't make any sense to me,
//why 7 after typecast if it's represented internally as 8?
debug_zval_dump((0.1+0.7)*10); //double(8) refcount(1)
debug_zval_dump((int)((0.1+0.7)*10)); //long(7) refcount(1)
debug_zval_dump((float)((0.1+0.7)*10)); //double(8) refcount(1)

Pitão

>>> ((0.1+0.7)*10)
7.9999999999999991
>>> int((0.1+0.7)*10)
7

Javascript:

alert((0.1+0.7)*10); //7.999999999999999
alert(parseInt((0.7+0.1)*10)); //7

Rubi

>> ((0.1+0.7)*10).to_i                                                  
=> 7                                                                    
>>((0.1+0.7)*10)                                                       
=> 7.999999999999999                                                    

questionAnswers(7)

yourAnswerToTheQuestion