我需要为我的数据库主键列生成唯一的Long ID.
我以为我可以使用UUID.randomUUID().getMostSignificantBits(),但有时它会产生一些负面长,这对我来说也是个问题.
是否有可能只从UUID生成正长?会有数十亿条目,所以我希望每个生成的密钥必须是唯一的.
根据标准ES 将数字实现为 IEEE754 双倍。
每https://www.binaryconvert.com/result_double.html?decimal=053055050054055049056048053048053054056053048051050057054和其他编程语言https://play.golang.org/p/5QyT7iPHNim它看起来像5726718050568503296值可以精确表示不失精度。
为什么它在 JS 中丢失了 3 个有效数字(在最新的稳定版 google chrome 和 firefox 中转载)
这个问题最初是从golang 中的复制 javascript 不安全数字触发的
该值在双 IEEE754 中绝对可以表示,请参阅 Go 中如何将裸位转换为 float64:https : //play.golang.org/p/zMspidoIh2w
我使用Django Rest Framework创建了一个Django REST API .
我使用3个不同的客户来点击这个应用程序:
我有一个令人困惑的问题,即API返回的数据被Swagger和Angular损坏,而不是被Curl破坏.
我的Django模型看起来像这样:
class MyModel1(CachingMixin, models.Model):
id = models.BigIntegerField(default=make_id, primary_key=True)
name = models.CharField(max_length=50, null=False, blank=False,)
Run Code Online (Sandbox Code Playgroud)
这里make_id()描述了上面引用的方法.我最近从标准的Django分配和自动递增的主键实现了这一变化.作为改变的一部分,我将id从IntegerFielda 转换为a BigIntegerField.
我有一些其他Django视图代码(我在这里没有显示)创建一个名为的端点GetMyModel1ByName.该端点返回一个序列化的实例MyModel1.这是卷曲,显示当我点击该端点时会发生什么.它完美地运作:
$ curl http://localhost:4212/api/getMyModel1ByName/?name=my-name
{"id": 10150133855458395, "name": "my-name"}
Run Code Online (Sandbox Code Playgroud)
现在,当我从Chrome的开发者控制台访问同一个端点时会发生什么:
> $http = angular.element(document.body).injector().get('$http');
> $http.get("http://localhost:4212/api/getMyModel1ByName/?name=my-name").then(function(response) { console.log(JSON.stringify(response.data)) }).catch(function (error) { console.log(error.data) });
{"id":10150133855458396, "name":"my-name"}
Run Code Online (Sandbox Code Playgroud)
正如您所见,curl将ID报告为10150133855458395.这是正确的.这就是数据库中的内容.但Angular将其报告为1015013385545839 6.最后的数字是错误的.差异是1.这是非常令人惊讶的!
这是一个真正令人困惑的错误.我的Django代码非常简单,我非常有信心它没有错误.相反,我觉得这个改变id从外地IntegerField到BigIntegerField可能导致此问题.为什么会这样,解决方案是什么?它破坏了我的应用程序的功能.当我通过Swagger点击此端点时,我看到同样的损坏.
编辑:另一个提问者遇到了同样的问题.很高兴知道我不是唯一一个!但是,这个问题的答案并不是真正的答案.他们没有解释原因.他们没有告诉我如何在Angular JS代码中解决问题.
请告诉我,如何从json中获取数字,为什么数字末尾会出现零?
var a = '{ "n": 870744036720833075 }';
var json = JSON.parse(a);
document.getElementById('test').innerHTML = json.n; // 870744036720833000 why?
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
正如我在这个问题中提到的,从服务器获取响应时遇到问题。
我收到一组具有以下属性的对象:
[{
"Id": 143187001116603, // VERY big number which I want to convert it to string
"Name": "????612", // string
"Title": "??????? ???? ???? ???-?????96", // string
"InsCode": "IRO6MELZ96C1" // string
},
...
]
Run Code Online (Sandbox Code Playgroud)
任何简单的方法来指定类型(转换Number),以string在一个JSON文件?
我看到了replacer论点,JSON.stringify()但我不知道如何使用它...
其中一个 Id 是:9481703061634967但是 JS 将其转换为9481703061634968!
正如乔纳斯 H在这个答案中所说,JS 运行默认解析,这就是为什么我失去了我的真正Id价值!
任何的想法?
可能重复:
大量错误在Javascript中舍入
在javascript中处理数字时,我遇到了一些奇怪的行为.当我使用以下代码时:
<a href="javascript:console.log({'id':9200000000032337}.id);"> CLICK HERE </a>
Run Code Online (Sandbox Code Playgroud)
我在控制台中得到了号码920000000003233 6.我认为它最多是数字的舍入或最大值,但我完全不理解它.任何人?
我有一个有趣的问题,我一直在用javascript做一些工作,数据库ID出现为"3494793310847464221",现在这是作为数字输入javascript但是它使用数字作为不同的值,两者输出到警报以及传递给另一个javascript函数时.
以下是一些示例代码,可以最大限度地显示错误.
<html><head><script language="javascript">alert( 3494793310847464221);
var rar = 3494793310847464221;
alert(rar);
</script></head></html>
Run Code Online (Sandbox Code Playgroud)
这完全困扰了我,因为谷歌不是我的朋友......
顺便说一下这个数字比那里的数字多179个......
所以我用javascript Number()函数遇到了这个问题,它似乎返回了错误的值:以下代码:Number(“10153396863200835”)返回
10153396863200836,而不是10153396863200835
但如果我执行 Number("10153396863200836") 它返回 10153396863200836 并且 Number("10153396863200834") 返回 10153396863200834
所以我很困惑发生了什么事?谢谢
javascript ×6
json ×3
angularjs ×1
django ×1
ecmascript-6 ×1
ieee-754 ×1
java ×1
numbers ×1
python ×1
react-native ×1
reactjs ×1
rest ×1
uuid ×1