这里是code:
class FeedOculosDetalhesViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var nomeLabel: UILabel!
@IBOutlet weak var precoLabel: UILabel!
@IBOutlet weak var descricaoLabel: UILabel!
var oculos: Oculos? {
didSet {
nomeLabel.text = oculos?.nome // error on this line
precoLabel.text = "R$ \(String(describing: oculos?.preco))"
descricaoLabel.text = oculos?.descricao
}
}
override func viewDidLoad() {
super.viewDidLoad()
}
打印:
typedef std::numeric_limits<float> fl;
int main()
{
std::cout.precision(100);
float f1 = 9999978e3;
std::cout << f1 << " (9999978e3 decimal number stored as binary)" << std::endl;
float f2 = 9999979e3;
std::cout << f2 << " (9999979e3 decimal number stored as binary)" << std::endl;
float f3 = 9999990e3;
std::cout << f3 << " (9999990e3 decimal number stored as binary)" << std::endl;
std::cout << "-----^" << std::endl;
}
以二进制形式存储的十进制数字正确保留9999978496 (9999978e3 decimal number stored as binary)
9999978496 (9999979e3 decimal number stored as binary)
9999989760 (9999990e3 decimal number stored as binary)
-----^
和9999978e3
的第6位数( 7 ),但9999979e3
的第6位数字是 8 而非 9 。
浮点精度是否始终保证前6位?
是的,如果我绕 89 我 9 ,但那不一样;这只会在视觉和#34;中起作用/有意义。
稍后(关于处理数字),当我对该值应用数学时,它会对9999990e3
数字(99999 8 9760)起作用,并且不在xxxxx8
上。这个数字的+1。
答案 0 :(得分:8)
不是你认为保证的方式,不是。
通过提供一个反例,对于IEEE754单精度浮点数,最接近的数字
9999990000
是
9999989760
保证的是,您的号码和float
,当两者都四舍五入到六位有效数字时,将是相同的。这是您平台上FLT_DIG
的值,假设它实现了IEEE754。例如。与float
最接近的9999979000
号码为9999978496
。
答案 1 :(得分:1)
你永远不会得到一个精确的数字位数10,因为这个数字不是以10为基数存储的,大多数基数10的分数在基数2中没有完美的表示。几乎总会出现舍入错误,并且通过重复添加你可以放大那个舍入误差。
例如,1/5具有这种二进制模式:
111110010011001100110011001101
我们只关心你所谈论的最后23位(尾数)......
10011001100110011001101
注意1001
的重复模式。要真正代表0.2,该模式必须永远重复,而不是以1的舍入结束。
将该数字乘以足够的数量,并将舍入误差放大。
如果您需要精确的十进制数字,则使用整数数学并在分割的情况下以您满意的方式自行处理舍入。或者使用bigint库和有理数,并最终获得需要永远计算的巨大分数,但是你将拥有无限的精度。当然,任何无法表示为sqrt(6)
或pi
的理性数字的数字仍会有舍入错误。