以前は主に整数を使用していましたが、float または double を整数に切り詰める必要がある場合は、以前は次のように使用していました。
(int) someValue
私が次のことを知るまでを除いて:
NSLog(@"%i", (int) ((1.2 - 1) * 10)); // prints 1
NSLog(@"%i", (int) ((1.2f - 1) * 10)); // prints 2
(説明については、C# で float を int にキャストするときの奇妙な動作を参照してください)。
簡単な質問は、float または double を整数に適切に切り捨てるにはどうすればよいかということです。(この場合、「丸め」ではなく切り捨てが必要です)。または、1 つの数値が 1.9999999999999 であり、もう 1 つの数値が 2.00000000000001 であるため (大まかに言えば)、切り捨ては実際には正しく行われていると言えます。問題は、float や double をどのように変換すれば、結果が一般的な使用法で意味のある "切り捨てられた" 数値になるかということです。
round
(この場合、 forの代わりに1.8
の結果が必要なため、を使用するつもりはありません)1
2
より長い質問:
使った
int truncateToInteger(double a) {
return (int) (a + 0.000000000001);
}
-(void) someTest {
NSLog(@"%i", truncateToInteger((1.2 - 1) * 10));
NSLog(@"%i", truncateToInteger((1.2f - 1) * 10));
}
どちらも として出力されます2
が、ハックが多すぎるようです。「不正確さを取り除く」には、どの小さな数字を使用すればよいでしょうか? そのような恣意的なハックの代わりに、より標準的または研究された方法はありますか?
(たとえば、秒数が 90 または 118 の場合、何分と何秒経過したかを示す場合、分は として表示する必要があります1
が、そうすべきではありません。に切り上げる2
)