2015-10-17 3 views
0

Друзья,функция уменьшения дает отрицательный ответ

Я пытаюсь изучить кодировку Scala и изучить функцию reduce() на данный момент. Я не понимаю, почему следующий фрагмент кода, чтобы умножить все числа в списке дает мне отрицательный результат:

val inputRDD=sc.parallelize(List(1,2,3,3,4,5,6,7,8,9,19,22,21,25,34,56,4,32,56,70)) 

    val result=inputRDD.reduce((x,y)=>x*y) 

    println(result)` 

я получаю ответ «-1619001344», когда я запускаю приведенный выше код. Если я попытаюсь использовать «+» в сокращении вместо «*», я получаю правильную сумму, но не иначе. Я также попытался преобразовать результат в Int, String и Long

+5

Вы пробовали рассчитать фактический результат? Вероятно, это переполнение. –

+2

Продукт 228235320014929920000, который не вписывается в 32 или 64-битное целое число, поэтому действительно переполняется. – WhiteViking

+0

Итак, если я все еще _did_ должен умножить все эти числа и вернуть результат, возможно ли это с помощью какого-либо другого типа или метода данных? –

ответ

1

Типы Int и Long переполнены, поэтому для этой операции вам нужно использовать BigInt.

val inputRDD = sc.parallelize(List(1,2,3,3,4,5,6,7,8,9,19,22,21,25,34,56,4,32,56,70)) 

val inputRDDasBigInt = inputRDD.map(x => scala.BigInt(x)) 
val result = inputRDDasBigInt.reduce((x,y)=>x*y) 

println(result) 
228235320014929920000 
+0

Спасибо, что ваш пример сработал! Я немного изменил его, чтобы использовать inputRDD.map (x => scala.BigInt (x)) без toString, и он показывает тот же результат (в случае, если это помогает) :) –

+0

Позвольте мне добавить, что исправление спасибо! – marios

Смежные вопросы