例を挙げると、以下で「B = 123457」と出力されることがありました
(実際の数値は控えてませんでした
float A = 123.456;
long B = A * 1000; → 123456 となって欲しいけど…
想定通りの値が返るときと、そうでないときがあるのはよくないので
どうしようかと考えていました。
そこで考えたのが、
・Aを文字列に変換
・文字列から小数点を抜く(x1,000となる)
・それをlongに変換してBに代入する
という方法でした。
書きながら、きっとスマートな方法があるんだろうなぁとは思っていたのですが
見つけることができませんでした。
ということで、参考サイトをもとにして関数にしてみました。
--------------------------------------------これはタイムアタックのタイマー処理で使っています。
/**
* 1000倍して float → long
**/
- (long) Float2Long:(float)input
{
// 小数点4位以下は切り捨て
NSString *string = [NSString stringWithFormat : @"%.3f", input];
// ドット位置で左右に分割
NSRange found = [string rangeOfString:@"." options:NSLiteralSearch];
NSString *string_left = [string substringToIndex:found.location];
NSString *string_right = [string substringFromIndex:found.location + found.length];
// 小数点を抜いて文字列を連結 → 1000倍になる
NSString *connect = [NSString stringWithFormat : @"%@%@", string_left, string_right];
// 文字列をlongに変換して返す
return [connect longLongValue];
}
--------------------------------------------
1,000分の1秒でも誤差は生じてはいけないので、試行錯誤したのでした。
floatからlongに変換しているのは、OpenFeintに送信する際にlong型で扱うためです。
この方法は今見ても強引だなぁと思いつつ、開発ログとして残してみました。
もっと勉強しよう。
任意の文字が現れる場所を確認する :
http://program.station.ez-net.jp/special/handbook/objective-c/nsstring/range-of-string.asp