In-order Predecessor BST review
CodeReview is a good place for this question....

There are a few things that you should consider...

Style

node is a bad name for a Java class. Standards for Java are that Class names are CamelCase, and your node class should be called Node.

Using == to compare double values is often a cause of bugs. In this case I believe it is 'safe', but you should be aware that it is, in general, a 'bad idea'. 

It is typical, though not required, that when you have an if {.....; return ...} block that you do not have an else block. For example, you have:

if (this.hasNum(...)) {
    .....
    return returner.key;
} else {
    return Double.NaN;
}


In this case the else block is not necessary, and it could simply be:

if (this.hasNum(...)) {
    .....
    return returner.key;
}
return Double.NaN;


Otherwise, the style is good.

Logic

You actually loop through the tree three times. I presume hasNum(...) also walks the tree.

With problems like this you can reduce the problem to a single walk of the Tree.

node match = null;
node current = root;
node predecessor = null;
// walk the tree until we find our exact match....
// Our predecessor node will follow us whenever we take a right branch....
while (current != null) {
    if (current.key == num) {
        match = current;
        break;
    }
    if (num &lt; current.key) {
        current = current.left;
    } else {
        predecessor = current;
        current = current.right;
    }
}
if (match == null) {
    return Double.NaN;
}
if (match.left != null) {
    predecessor = match.left;
    while (predecessor.right != null) {
        predecessor = predecessor.right;
    }
}
if (predecessor == null) {
    return Double.NaN;
}
return predecessor.key;