Переменная типа Double не вычисляется с двойными значениями - PullRequest
0 голосов
/ 22 ноября 2011

У меня есть этот код:

partialProg = 100 * ((i+1) / len);
Log.i(null, "100 * (" + (i+1) + "/" + len + ")" );
Log.i(null, "" + (int) partialProg + " <- int cast    original double -> " + partialProg);

, где partialProg - это двойное число, инициализированное в 1.0 как глобальная переменная.partialProg используется для вычисления прогресса в длительном процессе загрузки (len - это количество точек данных для загрузки, а i - текущая точка данных, в которой находится цикл).Логично, что это правильно.

Однако, мой ProgressDialog всегда отображает 0% до последней итерации, в которой отображается 100%.

Любопытно, я использовал сообщения журнала, чтобы попытатьсянайти проблему.Я получаю такие результаты:

11-22 13:21:47.714: ERROR/(3110): LOOP ENTERED: 1 accelX to check for null: -2.329
11-22 13:21:48.044: DEBUG/rapi(3110): Successful request
11-22 13:21:48.044: INFO/global(3110): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.
11-22 13:21:48.064: INFO/(3110): 100 * (2/20)
11-22 13:21:48.074: INFO/(3110): 0 <- int cast    original double -> 0.0
11-22 13:21:48.104: ERROR/(3110): LOOP ENTERED: 2 accelX to check for null: -10.924
11-22 13:21:48.434: DEBUG/rapi(3110): Successful request
11-22 13:21:48.434: INFO/global(3110): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.
11-22 13:21:48.454: INFO/(3110): 100 * (3/20)
11-22 13:21:48.454: INFO/(3110): 0 <- int cast    original double -> 0.0
11-22 13:21:48.484: ERROR/(3110): LOOP ENTERED: 3 accelX to check for null: -8.281
11-22 13:21:48.664: DEBUG/rapi(3110): Successful request
11-22 13:21:48.674: INFO/global(3110): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.
11-22 13:21:48.694: INFO/(3110): 100 * (4/20)
11-22 13:21:48.694: INFO/(3110): 0 <- int cast    original double -> 0.0
11-22 13:21:48.754: ERROR/(3110): LOOP ENTERED: 4 accelX to check for null: -2.438
11-22 13:21:49.334: DEBUG/rapi(3110): Successful request
11-22 13:21:49.334: INFO/global(3110): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.
11-22 13:21:49.334: INFO/(3110): 100 * (5/20)
11-22 13:21:49.334: INFO/(3110): 0 <- int cast    original double -> 0.0
11-22 13:21:49.364: ERROR/(3110): LOOP ENTERED: 5 accelX to check for null: -9.657
11-22 13:21:49.554: DEBUG/rapi(3110): Successful request
11-22 13:21:49.554: INFO/global(3110): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.
11-22 13:21:49.554: INFO/(3110): 100 * (6/20)
11-22 13:21:49.554: INFO/(3110): 0 <- int cast    original double -> 0.0
11-22 13:21:49.584: ERROR/(3110): LOOP ENTERED: 6 accelX to check for null: 7.042
11-22 13:21:49.653: DEBUG/rapi(3110): Successful request
11-22 13:21:49.653: INFO/global(3110): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.
11-22 13:21:49.653: INFO/(3110): 100 * (7/20)
11-22 13:21:49.653: INFO/(3110): 0 <- int cast    original double -> 0.0
11-22 13:21:49.694: ERROR/(3110): LOOP ENTERED: 7 accelX to check for null: -6.347
11-22 13:21:49.814: DEBUG/rapi(3110): Successful request
11-22 13:21:49.814: INFO/global(3110): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.
11-22 13:21:49.814: INFO/(3110): 100 * (8/20)
11-22 13:21:49.824: INFO/(3110): 0 <- int cast    original double -> 0.0
11-22 13:21:49.844: ERROR/(3110): LOOP ENTERED: 8 accelX to check for null: -15.663
11-22 13:21:49.973: DEBUG/rapi(3110): Successful request
11-22 13:21:49.973: INFO/global(3110): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.
11-22 13:21:49.973: INFO/(3110): 100 * (9/20)
11-22 13:21:49.973: INFO/(3110): 0 <- int cast    original double -> 0.0
11-22 13:21:50.013: ERROR/(3110): LOOP ENTERED: 9 accelX to check for null: -1.771
11-22 13:21:50.143: DEBUG/rapi(3110): Successful request
11-22 13:21:50.143: INFO/global(3110): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.
11-22 13:21:50.143: INFO/(3110): 100 * (10/20)
11-22 13:21:50.154: INFO/(3110): 0 <- int cast    original double -> 0.0
11-22 13:21:50.174: ERROR/(3110): LOOP ENTERED: 10 accelX to check for null: 12.326
11-22 13:21:50.304: DEBUG/rapi(3110): Successful request
11-22 13:21:50.304: INFO/global(3110): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.
11-22 13:21:50.304: INFO/(3110): 100 * (11/20)
11-22 13:21:50.304: INFO/(3110): 0 <- int cast    original double -> 0.0
11-22 13:21:50.324: ERROR/(3110): LOOP ENTERED: 11 accelX to check for null: -1.553
11-22 13:21:50.434: DEBUG/rapi(3110): Successful request
11-22 13:21:50.434: INFO/global(3110): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.
11-22 13:21:50.444: INFO/(3110): 100 * (12/20)
11-22 13:21:50.444: INFO/(3110): 0 <- int cast    original double -> 0.0
11-22 13:21:50.474: ERROR/(3110): LOOP ENTERED: 12 accelX to check for null: 3.895
11-22 13:21:50.584: DEBUG/dalvikvm(3110): GC_FOR_MALLOC freed 7642 objects / 590016 bytes in 95ms
11-22 13:21:50.684: DEBUG/rapi(3110): Successful request
11-22 13:21:50.684: INFO/global(3110): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.
11-22 13:21:50.694: INFO/(3110): 100 * (13/20)
11-22 13:21:50.694: INFO/(3110): 0 <- int cast    original double -> 0.0
11-22 13:21:50.704: ERROR/(3110): LOOP ENTERED: 13 accelX to check for null: 3.895
11-22 13:21:50.814: DEBUG/rapi(3110): Successful request
11-22 13:21:50.814: INFO/global(3110): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.
11-22 13:21:50.824: INFO/(3110): 100 * (14/20)
11-22 13:21:50.824: INFO/(3110): 0 <- int cast    original double -> 0.0
11-22 13:21:50.844: ERROR/(3110): LOOP ENTERED: 14 accelX to check for null: 6.320
11-22 13:21:51.033: DEBUG/rapi(3110): Successful request
11-22 13:21:51.033: INFO/global(3110): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.
11-22 13:21:51.033: INFO/(3110): 100 * (15/20)
11-22 13:21:51.033: INFO/(3110): 0 <- int cast    original double -> 0.0
11-22 13:21:51.064: ERROR/(3110): LOOP ENTERED: 15 accelX to check for null: -3.868
11-22 13:21:51.164: DEBUG/rapi(3110): Successful request
11-22 13:21:51.164: INFO/global(3110): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.
11-22 13:21:51.164: INFO/(3110): 100 * (16/20)
11-22 13:21:51.164: INFO/(3110): 0 <- int cast    original double -> 0.0
11-22 13:21:51.194: ERROR/(3110): LOOP ENTERED: 16 accelX to check for null: -9.820
11-22 13:21:51.304: DEBUG/rapi(3110): Successful request
11-22 13:21:51.304: INFO/global(3110): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.
11-22 13:21:51.314: INFO/(3110): 100 * (17/20)
11-22 13:21:51.314: INFO/(3110): 0 <- int cast    original double -> 0.0
11-22 13:21:51.324: ERROR/(3110): LOOP ENTERED: 17 accelX to check for null: -5.530
11-22 13:21:51.454: DEBUG/rapi(3110): Successful request
11-22 13:21:51.454: INFO/global(3110): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.
11-22 13:21:51.464: INFO/(3110): 100 * (18/20)
11-22 13:21:51.464: INFO/(3110): 0 <- int cast    original double -> 0.0
11-22 13:21:51.474: ERROR/(3110): LOOP ENTERED: 18 accelX to check for null: -2.601
11-22 13:21:51.583: DEBUG/rapi(3110): Successful request
11-22 13:21:51.583: INFO/global(3110): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.
11-22 13:21:51.583: INFO/(3110): 100 * (19/20)
11-22 13:21:51.594: INFO/(3110): 0 <- int cast    original double -> 0.0
11-22 13:21:51.614: ERROR/(3110): LOOP ENTERED: 19 accelX to check for null: -6.020
11-22 13:21:52.043: DEBUG/dalvikvm(767): GC_EXPLICIT freed 347 objects / 19880 bytes in 129ms
11-22 13:21:52.054: DEBUG/rapi(3110): Successful request
11-22 13:21:52.054: INFO/global(3110): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.
11-22 13:21:52.054: INFO/(3110): 100 * (20/20)
11-22 13:21:52.054: INFO/(3110): 100 <- int cast    original double -> 100.0
11-22 13:21:52.354: WARN/IInputConnectionWrapper(3110): finishComposingText on inactive InputConnection

Вы можете видеть, что это говорит о том, что partialProg всегда равно 0, что я предполагаю, потому что это умножает некоторое десятичное число <1 на 100. Но этодвойной!Зачем это делать?Я даже пытался типизировать его во многих местах в два раза - без разных результатов. </p>

Есть идеи, что здесь происходит?

Ответы [ 2 ]

1 голос
/ 22 ноября 2011

Вы не указываете свой язык, поэтому я проверил это на Java.

Я вижу вашу проблему, когда у меня есть переменная len , определенная как int. Когда я переключаю его на double, он работает как положено.

1 голос
/ 22 ноября 2011

Неважно, как вы инициализируете partialProg, так как вы немедленно перезаписываете его.

Имеет значение тип выражения 100 * ((i+1) / len);, которое в вашем случае является целым числом (при условии, что i и len - целые числа) Следовательно, значение выражения ограничивается целочисленными значениями.

Чтобы сделать выражение типа double, просто сделайте отдельные термины двойными. Например:

100.0 * double(i + 1) / double(len);
...