有没有办法防止stringWithFormat四舍五入?

时间:2011-07-03 06:26:27

标签: iphone objective-c

我正试图从这样的双重字符串中获取字符串:

double aDouble;
NSString* doubleString = [NSString stringWithFormat:@"%g", aDouble];

对于大多数数字,我得到了预期的结果,但是对于

10000.03

我明白了:

10000

作为我的字符串。有没有办法防止这种行为?我希望结果是一串

10000.03

2 个答案:

答案 0 :(得分:3)

在没有精确说明符的情况下,

%g可能会很棘手。请注意,%f可以与double值一起使用,您可以使用%.2f限制小数点后的位数(将2替换为您的任意位数要)。

%g是一种格式说明符,可根据以下算法在%f%e之间进行选择:

  • 如果指定了非零精度,则让 P 成为精度
  • 如果指定了零精度,则让 P 为1
  • 如果未指定精度,请将 P 设为6
  • 如果转换使用%e格式说明符,则 X 为指数
    • 如果 P > X > = -4,转换为样式%f,精度 P - ( X + 1)
    • 否则,转换的格式为%e,精度 P - 1。
  • 除非使用#标志,否则将从结果的小数部分删除任何尾随零,如果没有剩余小数部分,则删除小数点字符。

在您的情况下,%g未指定精度,因此 P = 6.当使用%e转换10000.03时,得到1.000003e + 04,指数是4,因此 X = 4.因为 P > X > = -4,转换为样式%f,精度 P - ( X + 1)= 6 - (4 + 1)= 1.但10000.03精度为1(小数点后一位)产生10000.0,没有实际的小数部分,因此%g将10000.03格式化为10000.

答案 1 :(得分:1)

尝试%。2f而不是%g

浮点数和双数是我们希望在十进制中看到的数字的基数两个表示,就像没有办法准确地表示基数为十的数字1/3而有限数字位数有很多基数为10的数字这不能在基数2中精确表示。例如,0.1(1/10)不能在基数2中精确表示。