如何将浮点值附加为字典中的浮点数?

Posted

技术标签:

【中文标题】如何将浮点值附加为字典中的浮点数?【英文标题】:How to append a float value as float in dictionary? 【发布时间】:2014-12-26 15:15:43 【问题描述】:

我需要向服务器计算一个带有 json 值的 MD5 值,例如,


  "name":"swift",
  "version":1.0,
  "edition":1,
  "date":"2014-12-26"
 

在这个 json 中,版本需要以浮点 1.0 而不是 1 发送,版本需要以整数 1 发送。

所以,我尝试创建一个字典并做了一个NSJSONSerialization

NSDictionary *d = @@"name":@"swift",
@"version":[NSDecimalNumber decimalNumberWithString:@"1.0"],
@"edition":[NSNumber numberWithInt:1],@"date":@"2014-12-26"; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:d options:0 error:nil];

但这是创建一个 json 响应为


  "name":"swift",
  "version":1,
  "edition":1,
  "date":"2014-12-26"

所以MD5 值不匹配。

谁能帮我创建一个带有浮点值的json,用于带有小数点(1.0)的“版本”?

【问题讨论】:

作为字符串,您可以使用 [NSString stringWithFormat:@"%.1f", 1.f] 获取它,其中 1.f 是您的浮点数。 @zero - 大错特错。数字必须编码为 NSNumber(或 NSDecimalNumber)才能添加到 JSON 对象。如果您将其编码为字符串,它将出现在 JSON 中的引号中,并且将在另一端作为字符串接收,而不是预期的数字。 这样认为(但我从未使用过 JSON)——只是想确保 OP 知道“格式字符串说明符”。 我认为尝试比较数据结构的 JSON 表示的 MD5 总和是不明智的。 JSON 可以以多种不同的方式进行格式化,而不会改变其含义。例如,空格实际上是任意的。 JSON 不区分浮点数和整数。在 Cocoa 的情况下,数字将被包裹在 NSNumber 中,据记载它不会保留构造它的原始类型。 是的,在 JSON 上计算校验和的唯一原因是将传输的值与接收的值进行比较,以检测传输过程中的损坏。永远不要期望两个单独构造的 JSON 字符串逐位相同或具有相同的校验和。 【参考方案1】:

在 JSON 中将数值 1.0 简单地发送为 1 并没有错。虽然如果您在 NSNumber 中编码一个浮点数,而不是使用 NSDecimalNumber,那么您获得 .0 可能会有一点运气。

`... @"version":@(1.0)...`

完整的字典:

NSDictionary *d = @@"name":@"swift",
@"version":@(1.0),
@"edition":@(1),
@"date":@"2014-12-26"; 

【讨论】:

【参考方案2】:

创建NSMutableDictionary,将数字转换为NSNumber并放入NSMutableDictionary

NSMutableDictionary *dict = [NSMutableDictionary dictionary];

float value = 1.0;

NSNumber *number = [NSNumber numberForFloat:value];
[dict setObject:number forKey:@"version"];

或使用文字将上面两行替换为:

dict[@"version"] = @(value);

【讨论】:

以上是关于如何将浮点值附加为字典中的浮点数?的主要内容,如果未能解决你的问题,请参考以下文章

如何将具有十进制值的数字转换为PL / SQL中的浮点数?

如何检查一个值是不是是javascript中的浮点数[重复]

C语言学习|判断语句中的浮点数比较问题

java中的浮点数

浮点数的十六进制表示

将字符串中的数字转换为 c 中的浮点数:atof()、strtof() 不起作用