You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Objective-C中保留Swift Double类型的.0小数部分?

问题分析与解决方案

首先得搞清楚为什么会出现这个情况:当Swift里的Double值是整数形式(比如1.0),桥接到Objective-C时会被自动包装成NSNumber。而NSNumber是一个通用数值容器,它会根据值的实际特征来选择存储类型——这里因为值是整数,所以它会以整数类型存储,自然输出的时候就没有.0了。

下面给你几种可行的解决思路,按需选择:

1. 直接转为字符串传递(最简单的展示方案)

如果你的需求只是在Objective-C中看到带.0的格式,不需要后续做数值计算,可以在Swift中直接把Double转成字符串再传递:

class Child: Parent {
    func log() {
        let measure = Double(1)
        let isLoggedIn = false
        // 把Double转为字符串,直接保留格式
        let data: [String: Any] = ["is_logged_in": isLoggedIn, "measure": String(measure)]
        log(data)
    }
}

在Objective-C中拿到的就是"1.0"字符串,直接输出即可。

2. 使用NSDecimalNumber包装(保留数值特性+格式)

如果还需要保留数值类型的特性(比如后续要计算),同时要保留小数位信息,可以用NSDecimalNumber来包装Swift的Double:

class Child: Parent {
    func log() {
        let measure = Double(1)
        let isLoggedIn = false
        // 用NSDecimalNumber包装,保留浮点特性
        let decimalMeasure = NSDecimalNumber(value: measure)
        let data: [String: Any] = ["is_logged_in": isLoggedIn, "measure": decimalMeasure]
        log(data)
    }
}

在Objective-C中处理时,直接调用stringValue就能得到带.0的结果:

-(void)log:(NSDictionary*)data {
    NSDecimalNumber *measure = data[@"measure"];
    NSLog(@"%@", measure.stringValue); // 输出 1.0
}

3. 强制格式化输出(OC端处理,无需修改Swift)

如果不想改动Swift的传递逻辑,只需要在Objective-C输出的时候强制显示小数位,可以用格式化字符串:

-(void)log:(NSDictionary*)data {
    NSNumber *measure = data[@"measure"];
    // 强制输出1位小数,不管原本是整数还是浮点数
    NSLog(@"%.1f", measure.doubleValue); // 输出 1.0
}

这个方案适合只是展示需求的场景,不需要改变数据的传递类型。

4. 自定义包装类(复杂场景统一处理)

如果你的项目中有很多类似的需求,需要统一标识这类需要保留小数位的数值,可以自定义一个Swift的包装类:

@objc class DoubleWithDecimal: NSObject {
    let value: Double
    
    @objc init(value: Double) {
        self.value = value
    }
    
    @objc func formattedString() -> String {
        return String(value)
    }
}

然后在传递时使用这个包装类:

class Child: Parent {
    func log() {
        let measure = Double(1)
        let isLoggedIn = false
        let wrappedMeasure = DoubleWithDecimal(value: measure)
        let data: [String: Any] = ["is_logged_in": isLoggedIn, "measure": wrappedMeasure]
        log(data)
    }
}

在Objective-C中调用formattedString方法就能得到"1.0":

-(void)log:(NSDictionary*)data {
    DoubleWithDecimal *measure = data[@"measure"];
    NSLog(@"%@", measure.formattedString()); // 输出 1.0
}

内容的提问来源于stack exchange,提问作者nambatee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:25:37