Почему результат Go такой же?

Я сделал https://www.npmjs.com/package/jsx-control-statements , чтобы сделать его немного легче, в основном это позволяет вам определить условные обозначения как теги, а затем компилирует их в trernary ifs, чтобы код внутри выполнялся только в том случае, если условие истинно.

1
задан Wai Ha Lee 16 January 2019 в 07:15
поделиться

2 ответа

Ваша проблема здесь:

result := int64((now-1)/blockInterval) * blockInterval

time.Now().Unix() возвращает текущее время Unix в секундах . Таким образом, для последовательных итераций time.Now().Unix() будет:

1257894001
1257894002
1257894003

Но в вашей функции вы вычитаете 1, а затем делите на десять, поэтому каждое из вышеперечисленных становится следующим, поскольку дробная часть отбрасывается .

125789400
125789400
125789400

Затем, когда вы умножаете на blockInterval (10), все они становятся:

1257894000
1257894000
1257894000

Таким образом, result заканчивается тем же. Если вы позволите ему работать дольше десяти секунд, вы увидите, что result изменится через 10 секунд:

https://play.golang.org/p/LgPtHwjwlC1 [1117 ]

0
ответ дан sma 16 January 2019 в 07:15
поделиться

На самом деле,

int64((now - 1)/blockInterval * blockInterval

не возвращает один и тот же результат все время. Вы заметите, что он меняется каждые 10 секунд.

Это вызвано целочисленным делением в Go. Если вы применяете целочисленное деление к любым двум числам, то дробная часть результата (остаток) отбрасывается. Например, int(12 / 10) = 1. В вашем конкретном случае - при делении на десять код сбрасывает остатки с 1 до 9 и увеличивает значение только тогда, когда вы переходите к следующим 10.

Если вы хотите повысить точность своих операций, то можете принудительно разделить числа с плавающей точкой следующим образом float64(12)/float64(10).

0
ответ дан Flimzy 16 January 2019 в 07:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: