我有一个对象,其属性定义为long,确切的值为635980054734850470
但是当它被序列化时,JSON输出会给我635980054734850400
似乎一直在放弃最后两位数值,而不是给出确切的值。这有什么理由吗?
以下是C#代码示例:
[Route("/timestamp", Verbs = "GET")]
public class GetTimestamp : IReturn<TimestampData>
{
}
public class TimestampData
{
public long Timestamp { get; set; }
}
public class TimestampService : CustomerServiceBase
{
public object Get(GetTimestamp request)
{
var timestamp = DateTime.UtcNow.Ticks;
Console.WriteLine(timestamp);
return new TimestampData() { Timestamp = timestamp };
}
}
示例输出:
{"Timestamp":635984646884003500}
请注意,输出始终舍入到最接近的100。
答案 0 :(得分:2)
JSON Serializer按预期工作:
$scope.items = JSON.parse(data.data);
JSON服务响应也是如此,您可以通过添加var json = "{\"Timestamp\":635980054734850470}";
var dto = json.FromJson<TimestampData>();
dto.ToJson().Print(); //= {"Timestamp":635980054734850470}
来查看,例如:
.json
或在Web Inspector,Fiddler或其他数据包检查器中查看响应。
我唯一看到它四舍五入的是ServiceStack的自动HTML5 Report Format页面,它将JSON响应解析为JavaScript对象,例如:
/timestamp.json
创建一个包含以下内容的JavaScript对象:
var model = {"Timestamp":635980054734850470};
这是因为JavaScript中的数字存储为highest integer it can store without losing precision为{Timestamp: 635980054734850400}
的双精度数,因为它小于9007199254740992
,最终会失去一些精度。