UIStepper.value 变成科学记数法

Posted

技术标签:

【中文标题】UIStepper.value 变成科学记数法【英文标题】:UIStepper.value becomes scientific notation 【发布时间】:2016-05-06 04:08:14 【问题描述】:

这是我的代码:

@IBAction func stepperChanged(sender: AnyObject) 
    let stepper = sender as! UIStepper
    stepper.stepValue = 0.1
    stepper.minimumValue = 0.0
    stepper.maximumValue = 1.0
    print("stepper value: \(stepper.value)")

当我一直按减号按钮时,输出是:

stepper value: 0.2
stepper value: 0.1
stepper value: 1.38777878078145e-16
stepper value: 0.0

为什么在 0.1 和 0.0 之间会有 1.38777878078145e-16

我想知道原因以及如何解决。

谢谢!

【问题讨论】:

把它想象成另一种形式的零。 为什么每次步进器的值发生变化时都要重置步进器的stepValueminimumValuemaximumValue @matt 谢谢!但是我还有一个问题:stepper上的减号按钮在值达到minimumValue的时候应该是不能点击的,但是当值为1.38777878078145e-16的时候还是可以点击的。只有当值真正变为0.0 时,减号按钮才会被禁用。我该如何防止这种情况?而且,为什么它变成科学记数法而不是变成零? @rmaddy 我只是想在这里演示我的步进设置。是的,每次都设置它们不是一个好主意,但我认为在这里没关系。 【参考方案1】:

请尝试最小值为 0,最大值为 10。

override func viewWillAppear(animated: Bool) 
        sampleUIStepper.minimumValue = 0
        sampleUIStepper.maximumValue = 10
        sampleUIStepper.stepValue = 1
    

将 UIStepper 的 sender 值转换为所需的格式并使用它。

@IBAction func sampleStepperValueChanged(sender: AnyObject) 
        let stepper = sender as! UIStepper

        let convertedValue = (stepper.value/10) as Double
        print(convertedValue)

    

【讨论】:

你能解释一下为什么这行得通而我的方法不行吗?谢谢 1.38777878078145e-16 是理想的零值的极好近似值,并且极好的近似值是您所希望的最好的近似值,使用有限精度算术。每次加或减 0.1 时都会累积舍入误差。【参考方案2】:

Doubles 不准确。

UIStepper.value 的类型是Double。而Doubles 的精度只有 16 - 17 位。这意味着在这段代码中,result 不等于 0.1:

let a = 0.3
let b = 0.2
let result = a - b
// result might be 0.1000000000000000007890778643

所以当你点击减号按钮时,代码中的某处有这样的语句:

value -= stepValue

由于stepValue 也是Double,因此并不精确。发生的情况是,当您第三次单击它时,步长值可能等于 0.9999999999999999138777878078145。所以stepper的值不是0。

另一种可能的解释是value 不准确,它可能是 0.1000000000000000861222121021854

记住,编程不是数学。

如何解决这个问题?

所以您想在减号按钮接近 0 时禁用它,对吗?很简单!

if stepper.value - 0 < 0.0000001 
    stepper.value = 0

【讨论】:

感谢您的解释。但是不准确可能发生在任何时候,我不应该认为这只发生在值接近零时,对吧?

以上是关于UIStepper.value 变成科学记数法的主要内容,如果未能解决你的问题,请参考以下文章

Excel 长串数变成科学计数法怎么办

为啥用excel输入长数字就变成科学记数法?

Excel身份证号为啥变成了科学计数

excel 文本转换数字,数字变成科学计数法了,该怎么解决??

Json数据解析的时候,数字字符串变成了科学计数法,怎么解决

为啥我的excel数字变成科学计数法了呢?