Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 我应该在maximumFractionDigits中设置什么以最小化数据丢失? 介绍_Ios_Swift_Formatting - Fatal编程技术网

Ios 我应该在maximumFractionDigits中设置什么以最小化数据丢失? 介绍

Ios 我应该在maximumFractionDigits中设置什么以最小化数据丢失? 介绍,ios,swift,formatting,Ios,Swift,Formatting,我注意到NumberFormatter#maximumFractionDigits默认值为3 我已证实: import Foundation let nf = NumberFormatter() nf.numberStyle = .decimal print(nf.maximumFractionDigits) //=> 3 nf.string(for: Decimal(string: "100.1111111")) //=> "100.111" 我已尝试设置Int.max 我将I

我注意到
NumberFormatter#maximumFractionDigits
默认值为3

我已证实:

import Foundation

let nf = NumberFormatter()
nf.numberStyle = .decimal
print(nf.maximumFractionDigits) //=> 3
nf.string(for: Decimal(string: "100.1111111")) //=> "100.111"
我已尝试设置Int.max 我将
Int.max
设置为
maximumFractionDigits

import Foundation

let nf = NumberFormatter()
nf.numberStyle = .decimal
nf.maximumFractionDigits = Int.max
nf.string(for: Decimal(string: "100.1111111")) // => "100"
为什么!?成为
“100”

在我的研究中 我读了
Foundation>NSNumberFormatter>NumberFormatter
源代码:

开放变量最大分数位数:Int

我已确认
maximumFractionDigits
数据类型为
Int

问题: 如何将最大值设置为
maximumFractionDigits

我希望尽可能不丢失地显示服务器响应。 当然,服务器响应是
json
中的
String
。但在ios应用程序中,大多数计算都是从
字符串
中使用
十进制
。因此,这个目标是将
UILabel
Decimal
转换为
String

  • 问题1<代码>nf.maximumFractionDigits=Int.max
。为什么要丢失数据?这是
NumberFormatter
上的错误
  • 问题2。如何将最大值设置为
    maximumFractionDigits
    正确
  • 目标 我希望将数据丢失降至最低。

    Q1。nf.maximumFractionDigits=Int.max。为什么要丢失数据?这是NumberFormatter上的错误?

    如果没有明确的文档记录,每个
    Int
    参数可能都有限制,具体取决于实现细节。如果传递的值超过此限制,则运行时错误可能会导致崩溃,或者可能会被静默忽略,所有这些都取决于实现细节

    据我测试,您可以设置为
    maximumFractionDigits
    的最大数字与
    Int32.max
    的值相同

    let nf = NumberFormatter()
    nf.numberStyle = .decimal
    nf.maximumFractionDigits = Int(Int32.max)+1
    print(nf.string(for: Decimal(string: "123.45678901234567890123456789012345678"))!)
    //->123
    nf.maximumFractionDigits = Int(Int32.max)
    print(nf.string(for: Decimal(string: "123.45678901234567890123456789012345678"))!)
    //->123.45678901234567890123456789012345678
    
    您可以称之为bug,但是,
    NumberFormatter
    可以处理的最大有效位是38位,即
    十进制数。谁想对比预期实际价值大数百万倍的价值做出精确定义

    Q2。如何将max设置为maximumFractionDigits正确?

    如上所述,
    十进制
    中的有效数字为38。你可以这样写:

    let nf = NumberFormatter()
    nf.numberStyle = .decimal
    nf.usesSignificantDigits = true
    nf.maximumSignificantDigits = 38
    print(nf.string(for: Decimal(string: "123.45678901234567890123456789012345678"))!)
    //->123.45678901234567890123456789012345678
    
    Q1。nf.maximumFractionDigits=Int.max。为什么要丢失数据?这是NumberFormatter上的错误?

    如果没有明确的文档记录,每个
    Int
    参数可能都有限制,具体取决于实现细节。如果传递的值超过此限制,则运行时错误可能会导致崩溃,或者可能会被静默忽略,所有这些都取决于实现细节

    据我测试,您可以设置为
    maximumFractionDigits
    的最大数字与
    Int32.max
    的值相同

    let nf = NumberFormatter()
    nf.numberStyle = .decimal
    nf.maximumFractionDigits = Int(Int32.max)+1
    print(nf.string(for: Decimal(string: "123.45678901234567890123456789012345678"))!)
    //->123
    nf.maximumFractionDigits = Int(Int32.max)
    print(nf.string(for: Decimal(string: "123.45678901234567890123456789012345678"))!)
    //->123.45678901234567890123456789012345678
    
    您可以称之为bug,但是,
    NumberFormatter
    可以处理的最大有效位是38位,即
    十进制数。谁想对比预期实际价值大数百万倍的价值做出精确定义

    Q2。如何将max设置为maximumFractionDigits正确?

    如上所述,
    十进制
    中的有效数字为38。你可以这样写:

    let nf = NumberFormatter()
    nf.numberStyle = .decimal
    nf.usesSignificantDigits = true
    nf.maximumSignificantDigits = 38
    print(nf.string(for: Decimal(string: "123.45678901234567890123456789012345678"))!)
    //->123.45678901234567890123456789012345678
    

    你希望发生什么?您正在尝试将9223372036854775807个小数位数添加到string@Dabus我想补充一点。@shingo.nakanishi什么用例需要这个?你的目标是什么?将数字转换为字符串时需要什么结果?您正在将一个字符串转换为另一个字符串。你说你不想失去。那么,为什么还要为任何转换而烦恼呢?@rmaddy我添加了目标。你希望发生什么?您正在尝试将9223372036854775807个小数位数添加到string@Dabus我想补充一点。@shingo.nakanishi什么用例需要这个?你的目标是什么?将数字转换为字符串时需要什么结果?您正在将一个字符串转换为另一个字符串。你说你不想失去。那么,为什么还要费心转换呢?@rmaddy我添加了目标。我真的很喜欢你的解释。我需要它正常工作,所以我深入研究了一下,发现到今天为止,运行Xcode 12,Swift 5.3,极限似乎是36个小数点。然而,非常有趣的是,如果创建一个十进制(字符串:“”,它会将前36位截断为36位。同样有趣的是,如果设置maximumSignificantDigits=36,它不会占用36位,而是会占用更少的数字。因此,我设置了
    Int(Int.max)
    在该字段中,我知道我将获得36位精度。我真的很喜欢你的解释。我需要它正常工作,所以我深入研究了一下,发现到今天为止,运行Xcode 12,Swift 5.3时,限制似乎是36个小数点。然而,有趣的是,如果你创建一个小数点(字符串:“,它将前36位数字截断为36位。同样有趣的是,如果设置maximumSignificantDigits=36,它不会占用36位数字,但会占用更少的数字。因此,我在该字段中设置了
    Int(Int.max)
    ,并且知道我将获得高达36位的精度。